以下是一个场景:
对象描述于:
首先,我从OpenGL应用模型视图(相机),然后使用以下矩阵应用平移和旋转:
private Matrix4d AnglesToMatrix(Vector3d angles)
{
Vector3d left = Vector3d.UnitX;
Vector3d up = Vector3d.UnitY;
Vector3d forward = Vector3d.UnitZ;
AnglesToAxes(angles, ref left, ref up, ref forward);
return new Matrix4d(
new Vector4d(left.X, up.X, forward.X, 0),
new Vector4d(left.Y, up.Y, forward.Y, 0),
new Vector4d(left.Z, up.Z, forward.Z, 0),
new Vector4d(0, 0, 0, 1));
}
private void AnglesToAxes(Vector3d angles, ref Vector3d left, ref Vector3d up, ref Vector3d forward)
{
const double DEG2RAD = 0.0174532925;
double sx, sy, sz, cx, cy, cz, theta;
// rotation angle about X-axis (pitch)
theta = angles.X * DEG2RAD;
sx = Math.Sin(theta);
cx = Math.Cos(theta);
// rotation angle about Y-axis (yaw)
theta = angles.Y * DEG2RAD;
sy = Math.Sin(theta);
cy = Math.Cos(theta);
// rotation angle about Z-axis (roll)
theta = angles.Z * DEG2RAD;
sz = Math.Sin(theta);
cz = Math.Cos(theta);
// determine left axis
left.X = cy * cz;
left.Y = sx * sy * cz + cx * sz;
left.Z = -cx * sy * cz + sx * sz;
// determine up axis
up.X = -cy * sz;
up.Y = -sx * sy * sz + cx * cz;
up.Z = cx * sy * sz + sx * cz;
// determine forward axis
forward.X = sy;
forward.Y = -sx * cy;
forward.Z = cx * cy;
}
at,最后我申请规模。除旋转外,所有看起来都很棒,它基于全局轴。
如何使用局部轴旋转对象?
准确提出问题。当我在Y轴上旋转对象45度时,X和Z轴随之旋转,然后使用新轴进行另一次旋转。
为了避免以错误的形式受到惩罚......我阅读了与3D空间中的旋转相关的所有主题,其中没有给我解决方案。上面的代码是应用各种尝试的结果,但它产生的结果与:
相同 GL.Rotate(Rotation.X, Vector3d.UnitX);
GL.Rotate(Rotation.Y, Vector3d.UnitY);
GL.Rotate(Rotation.Z, Vector3d.UnitZ);
修改 事实证明,我们的设计师对3D中物体的旋转抱有不好的期望,但问题仍然存在。至于使用的语言,我们用C#写这个,但如果你用C或C ++指出我的解决方案,我会处理它:D
我们目前使用(订单可以配置):
GL.Rotate(Rotation.X, Vector3d.UnitX);
GL.Rotate(Rotation.Y, Vector3d.UnitY);
GL.Rotate(Rotation.Z, Vector3d.UnitZ);
但是这会绕着世界轴旋转物体。我们想要的是使用这样的局部对象轴,假设我们有X-Y-Z轴旋转:
GL.Rotate(Rotation.X, Vector3d.UnitX);
GL.Rotate(Rotation.Y, newYaxis);
GL.Rotate(Rotation.Z, newZaxis);
或假设我们有Y-X-Z轴旋转
GL.Rotate(Rotation.Y, Vector3d.UnitY);
GL.Rotate(Rotation.X, newXaxis);
GL.Rotate(Rotation.Z, newZaxis);
最有效的方法是预先计算旋转矩阵,但我仍然想知道如何在旋转后确定新轴。 (它接缝我必须重新阅读三角书)。如果有人有解决方案可以快速计算旋转矩阵,我将不胜感激。现在我将尝试在每次传递中使用三角计算。
答案 0 :(得分:0)
我对opentk不太满意,但对于C风格的opengl,这是前乘法和后乘法之间的区别。预乘法发生在世界坐标空间中,后乘法发生在局部坐标空间中。请参阅http://www.opengl.org/archives/resources/faq/technical/transformations.htm第9.070节。
如果您可以获得实际矩阵的句柄来执行矩阵乘法,那么这应该可行。
答案 1 :(得分:0)
你能说出你在想什么样的情况吗?
我不相信你的要求有任何意义。对于任何旋转,您可以在另一个操作(全局轴)之前或在另一个操作(本地轴)之后应用它。因此,如果要应用三个旋转,则必须先进行一个轴旋转,另一个轴旋转必须为第二个,另一个轴必须为第三个。
你说你想要应用三次旋转,但是你希望每次旋转都发生在另外两次旋转之前。他们不可能都是第一个。
如果你想要更多描述(图片首选)你想要实现什么样的轮换,也许我们可以解决这个误解,但你现在所要求的对我来说在物理现实中没有意义。