我正在尝试在其Z轴(向上/向下)上旋转3D对象。
public void RotateY(float angle)
{
foreach (CoordinateVertices cv in this.GetAll<CoordinateVertices>())
{
for (int i = 0; i < cv.Coordinates.Length; i++)
{
Vector3 old = cv.Coordinates[i];
float theta = Math.Atan2(old.Y, old.X) + angle;
float rayon = Math.Sqrt(Math.Pow(old.X, 2) + Math.Pow(old.Y, 2));
cv.Coordinates[i] = new Vector3(Math.Cos(theta) * rayon, Math.Sin(theta) * rayon, old.Z);
}
}
}
三角函数非常简单,看起来效果很好,但出于某种原因,我的3D对象减少了一半。
有人知道发生了什么吗?我会在数学StackExchange上发布这个,但它也可能是我的编程问题,三角函数非常简单。
答案 0 :(得分:1)
编辑:以下是与上述相同的替代方法。我花了几分钟才意识到以下解决方案与最初发布的代码相同。
它应该是这样的:
double Xnew = X * cos(theta) + Y * sin(theta);
double Ynew = Y * cos(theta) - X * sin(theta);
或者在您的代码中:
public void RotateY(float angle)
{
foreach (CoordinateVertices cv in this.GetAll<CoordinateVertices>())
{
for (int i = 0; i < cv.Coordinates.Length; i++)
{
Vector3 old = cv.Coordinates[i];
float xnew = old.X * Math.Cos(angle) + old.Y * Math.Sin(angle);
float ynew = old.Y * Math.Cos(angle) - old.X * Math.Sin(angle);
cv.Coordinates[i] = new Vector3(xnew, ynew, old.Z);
}
}
}
上面的代码假设您正在围绕原点进行旋转。如果你没有围绕原点旋转,你只需要转换为原点,旋转,然后转换回来。
请点击此处了解详情:http://en.wikipedia.org/wiki/Transformation_matrix#Rotation
答案 1 :(得分:1)
如前所述,您的代码没有任何问题。但是,您可能也有兴趣使用Transform函数(可以同时对整个坐标数组进行操作)。 Vector3.Transform (Vector3[], Matrix)
。您可以使用针对任何轴计算给定角度θ的rotation matrix进行旋转。我希望这对于大量积分来说要快得多。 (减少三角计算,可能还有硬件加速)
答案 2 :(得分:0)
实际上,这个错误消失了,无处不在。我继续测试更多的值,他们工作了。我回到了和以前一样的价值,它起作用了。这太荒谬了,它总是发生在我身上。
这是什么名字?臭虫自己消失。