Editing Revolve
From BRL-CAD
Warning: You are not logged in. Your IP address will be publicly visible if you make any edits. If you log in or create an account, your edits will be attributed to your username, along with other benefits.
The edit can be undone.
Please check the comparison below to verify that this is what you want to do, and then save the changes below to finish undoing the edit.
Latest revision | Your text | ||
Line 1: | Line 1: | ||
− | |||
− | |||
= Overview = | = Overview = | ||
− | A solid of revolution can be described by its axis of revolution (point & vector), an angle (-2*pi, 2*pi), | + | A solid of revolution can be described by its axis of revolution (point & vector), an angle (-2*pi, 2*pi), a primitive or group to be revolved, and a second vector to give the r-z plane ( in cylindrical coordinates, local to the revolve) cutting through the primitive/group to generate the 2D outline to be revolved. The normal vector for this plane is (Vaxis) x (V2), and the plane should terminate at the (local) z-axis. |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | The start and end surfaces will be flat plates, and a positive angle is counterclockwise rotation. | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
= General Algorithms = | = General Algorithms = | ||
== rt_rev_shot() - ray intersection == | == rt_rev_shot() - ray intersection == | ||
+ | |||
+ | #Check the ray against the bounding cylinder to quickly exit for rays that are clearly non-intersecting. | ||
#If (angle != 2*pi) check against the start and end surfaces. | #If (angle != 2*pi) check against the start and end surfaces. | ||
− | ## | + | ##Check original ray against start surface |
− | ## | + | ##Transform ray (rotate about Z-axis) by -(angle), and check against start surface. (Or store the end surface seperately to avoid the ray transformation.) |
+ | |||
#For the revolved portion: | #For the revolved portion: | ||
##Flatten out the intersection to 2D (ignore theta): ray becomes hyperbola in the r-z plane (parameterized- use same variable for length along ray as length along hyperbola to keep mapping from 3D to 2D) | ##Flatten out the intersection to 2D (ignore theta): ray becomes hyperbola in the r-z plane (parameterized- use same variable for length along ray as length along hyperbola to keep mapping from 3D to 2D) | ||
##Check the hyperbola's path against the 2D revolve outline. Find the parameter values at the intersection points. | ##Check the hyperbola's path against the 2D revolve outline. Find the parameter values at the intersection points. | ||
− | ## | + | ##Use the parameters from (2) in the ray equation to find the actual (3D) intersection point. |
+ | ##Using the actual 3D intersection point, find theta for the hitpoint on the original primitive in local cylindrical coordinates. Check to ensure that the angle of the point from (3) is between (0, revolve angle). | ||
== rt_rev_norm() - surface normals @ hitpoint == | == rt_rev_norm() - surface normals @ hitpoint == | ||
Line 57: | Line 41: | ||
= Additional Features = | = Additional Features = | ||
− | |||
− | |||
− | |||
== End Caps == | == End Caps == | ||
Line 67: | Line 48: | ||
This would create a partial revolve (angle < 2*pi) with a 3D shape where the maximum outline does not fall in a r-z plane. A 2D example of this is revolving an ellipse with focii at (4,1) and (6, -1) about the z axis. For this case, the minimum radius and maximum radius do not occur along the same plane. If the end cap method (above) was used, there would be an abrubt transition from the ellipse to the revolved body. | This would create a partial revolve (angle < 2*pi) with a 3D shape where the maximum outline does not fall in a r-z plane. A 2D example of this is revolving an ellipse with focii at (4,1) and (6, -1) about the z axis. For this case, the minimum radius and maximum radius do not occur along the same plane. If the end cap method (above) was used, there would be an abrubt transition from the ellipse to the revolved body. | ||
− | This feature can best be implemented by using a sweep along a circular path, | + | This feature can best be implemented by using a sweep along a circular path, becasue the sweep primitive will need to handle this end condition for sweeping any other general 3D primitive. This approach minimizes code duplication, and keeps the revolve primitive focused specifically on revolving. |