* From Dahlia

* Committing : 0001449: Patch implements X and Y Top Shear parameters for torus prim physical mesh generation (PATCH attached) 
* The included patch implements the X and Y Top Shear parameter adjustments to the mesh generator for the torus prim physical mesh. These are approximations as I was unable to determine their exact function but they appear to generate meshes which quite closely duplicate their counterparts in the viewer. 
* Thanks Dahlia!!!!
0.6.0-stable
Teravus Ovares 2008-06-04 10:57:05 +00:00
parent 4ec4e16c80
commit 99e7a2a380
1 changed files with 36 additions and 21 deletions

View File

@ -255,7 +255,6 @@ namespace OpenSim.Region.Physics.Meshing
Mesh newLayer;
Mesh lastLayer = null;
//int start = 0;
int step;
int steps = 24;
@ -274,8 +273,17 @@ namespace OpenSim.Region.Physics.Meshing
float totalSkew = skew * 2.0f * pathLength;
float skewStart = (-skew) + pathCutBegin * 2.0f * skew;
float startAngle = (float)(System.Math.PI * 2.0 * pathCutBegin * revolutions);
float endAngle = (float)(System.Math.PI * 2.0 * pathCutEnd * revolutions);
// It's not quite clear what pushY (Y top shear) does, but subtracting it from the start and end
// angles appears to approximate it's effects on path cut. Likewise, adding it to the angle used
// to calculate the sine for generating the path radius appears to approximate it's effects there
// too, but there are some subtle differences in the radius which are noticeable as the prim size
// increases and it may affect megaprims quite a bit. The effect of the Y top shear parameter on
// the meshes generated with this technique appear nearly identical in shape to the same prims when
// displayed by the viewer.
float startAngle = (float)(System.Math.PI * 2.0 * pathCutBegin * revolutions) - pushY * 0.9f;
float endAngle = (float)(System.Math.PI * 2.0 * pathCutEnd * revolutions) - pushY * 0.9f;
float stepSize = (float)0.2617993878; // 2*PI / 24 segments per revolution
step = (int)(startAngle / stepSize);
@ -284,6 +292,7 @@ namespace OpenSim.Region.Physics.Meshing
float xProfileScale = 1.0f;
float yProfileScale = 1.0f;
#if SPAM
System.Console.WriteLine("Extruder: twistTop: " + twistTop.ToString() + " twistbot: " + twistBot.ToString() + " twisttotal: " + twistTotal.ToString());
System.Console.WriteLine("Extruder: startAngle: " + startAngle.ToString() + " endAngle: " + endAngle.ToString() + " step: " + step.ToString());
@ -346,35 +355,41 @@ namespace OpenSim.Region.Physics.Meshing
float twist = twistBot + (twistTotal * (float)percentOfPath);
float zOffset = (float)(System.Math.Sin(angle) * (0.5f - yPathScale)) * radiusScale;
float yOffset = (float)(System.Math.Cos(angle) * (0.5f - yPathScale)) * radiusScale;
float xOffset = 0.5f * (skewStart + totalSkew * (float)percentOfPath);
float xOffset;
float yOffset;
float zOffset;
// next apply twist rotation to the profile
if (twistTotal != 0.0f || twistBot != 0.0f)
{
Quaternion profileRot = new Quaternion(new Vertex(0.0f, 0.0f, -1.0f), twist);
foreach (Vertex v in newLayer.vertices)
xOffset = 0.5f * (skewStart + totalSkew * (float)percentOfPath);
xOffset += (float) System.Math.Sin(angle) * pushX * 0.45f;
yOffset = (float)(System.Math.Cos(angle) * (0.5f - yPathScale)) * radiusScale;
zOffset = (float)(System.Math.Sin(angle + pushY * 0.9f) * (0.5f - yPathScale)) * radiusScale;
// next apply twist rotation to the profile layer
if (twistTotal != 0.0f || twistBot != 0.0f)
{
if (v != null)
Quaternion profileRot = new Quaternion(new Vertex(0.0f, 0.0f, -1.0f), twist);
foreach (Vertex v in newLayer.vertices)
{
vTemp = v * profileRot;
v.X = vTemp.X;
v.Y = vTemp.Y;
v.Z = vTemp.Z;
if (v != null)
{
vTemp = v * profileRot;
v.X = vTemp.X;
v.Y = vTemp.Y;
v.Z = vTemp.Z;
}
}
}
}
// now orient the rotation of the profile relative to it's position on the path
Quaternion layerRot = new Quaternion(new Vertex(-1.0f, 0.0f, 0.0f), (float)angle);
// now orient the rotation of the profile layer relative to it's position on the path
// adding pushY to the angle used to generate the quat appears to approximate the viewer
Quaternion layerRot = new Quaternion(new Vertex(-1.0f, 0.0f, 0.0f), (float)angle + pushY * 0.9f);
foreach (Vertex v in newLayer.vertices)
{
if (v != null)
{
vTemp = v * layerRot;
//v.X = xProfileScale * vTemp.X + xOffset;
//v.Y = yProfileScale * vTemp.Y + yOffset;
v.X = vTemp.X + xOffset;
v.Y = vTemp.Y + yOffset;
v.Z = vTemp.Z + zOffset;