假设我有一个简单的WPF 3D场景,其中一个矩形绕X轴旋转-45度,如下所示:
这为我提供了以下内容:
现在我想将图像旋转45度
模型的Z轴
..。如果我像这样放入第二个RotateTransform3D:
它围绕
场景的
Z轴。对于这个特殊的X旋转,我计算出我需要的是:
但在这一点上,我的数学不及格。谁能告诉我如何计算任意旋转的"A“(和"B”,如果你愿意)?
发布于 2010-01-13 15:14:53
好的,我和一个数学家朋友谈过了,他给了我答案:
所以我认为如果你围绕向量(1,0,0)旋转一个'a‘的角度(也就是绕x轴旋转,这样你的对象在y-z平面上变换),你需要做的就是。
还有更多的旋转
x‘- (1,0,0)保持不变!
y‘- (0,cosa,新浪)
z‘- (0,-sina,cosa)
类似的原理也适用于x-z平面(0,1,0)中的旋转。
x‘- (-sina,0,cosa)
y‘- (0,1,0) -相同
z‘- (sina,o,cosa)
在x-y平面上(0,0,1)
x‘- (-sina,cosa,0)
y‘- (cosa,sina,0)
z‘- (0,0,1)保持不变
塔达!
更新:我创建了一个函数来计算一个矩阵,它将在所有3个轴上旋转一个对象。这可以与MatrixTransform3D一起使用。
Matrix3D CalculateRotationMatrix(double x, double y, double z)
{
Matrix3D matrix = new Matrix3D();
matrix.Rotate(new Quaternion(new Vector3D(1, 0, 0), x));
matrix.Rotate(new Quaternion(new Vector3D(0, 1, 0) * matrix, y));
matrix.Rotate(new Quaternion(new Vector3D(0, 0, 1) * matrix, z));
return matrix;
}
发布于 2021-02-28 07:26:23
您得出的答案包含三种不同的旋转,提供了可应用于对象的单个变换矩阵。这是可行的,但考虑到问题的措辞,这是不必要的。
在所描述的问题中,您希望平面围绕其Z轴旋转,但随后旋转的结果是围绕
场景的
X轴,如下所示:
这是将你想出的转换添加到原始转换的结果,即使用如下所示的分组转换:
问题是,你实际上首先遇到的唯一问题是,你以错误的顺序组合了原始变换,至少在上述问题的情况下是这样的。只需插入Z轴旋转即可实现完全相同的结果
之前
X轴旋转,而不是之后:
事实上,你在你的答案中发布的方法实际上只是完成相同作文的另一种方式。如果您将
从调用您的方法返回的值,传递
和
,即
方法返回的值基本上是相同的。
属性用于如上所述声明(或在代码隐藏中初始化)的组。
它看起来是一种不同的方法的唯一原因是,在直接处理矩阵数学时(正如您的方法所做的那样),与使用
对象进行组合(因为该对象颠倒了组合,以便它在XAML声明中更自然地出现)。
(我说“本质上”,是因为由于计算四元数的额外步骤引入的舍入误差,在一些矩阵分量中存在非常微小的差异。例如,当对旋转进行分组时,
组件具有值
,而使用您的方法的相同组件有价值
..。矩阵不会进行完全相同的比较,但它们在应用于场景中的对象时具有完全相同的视觉效果。)
现在,在代码隐藏中计算矩阵没有任何问题,如果这是您的代码需要架构的方式。使用四元数是一种行之有效的方法,特别是对于在两个不同旋转之间进行插值的目的(即,您希望为旋转设置动画并为此轻松计算中间旋转)。
但我认为重要的是要理解,并没有真正的“围绕自己的轴旋转一个物体”这样的东西。对象的变换总是相对于它所在的坐标空间发生,而不是相对于它自己的局部坐标空间。当对象相对于其父对象(无论是整个场景、顶级对象,还是场景中第一个对象是其子对象的某个其他对象)进行旋转或变换时,都会始终移动后者以保持与对象本身对齐。
在WPF中有许多不同的方法来组成3D变换矩阵,但它们实际上都归结为一件事:将两个或更多个矩阵相乘以得到最终的一个。甚至在通过场景对象图中的父/子关系将变换应用于不同对象时也是如此。事实上,在3D渲染API中,使用对象的层次关系更为惯用
如果您打算让给定对象仅围绕其自身的单个轴旋转
..。也就是说,在您的示例中,您可以为对象指定一个父对象,将X轴旋转应用于该父对象,然后仅将Z轴旋转应用到子对象。
例如,像这样的东西:
同样,同样的结果,只是用不同的方式来表示矩阵的组成。在这种情况下,这将是表示变换的一种更自然的方式,在这种情况下,渲染的平面应该只围绕“它自己的”Z轴旋转,但仍然相对于场景中也移动和/或旋转的某些父对象移动和/或旋转(例如,关节机械臂上的手、汽车上的轮子或某些作战车辆上的角楼,举几个经常出现在3D渲染场景中的示例)。
https://stackoverflow.com/questions/2042214
复制相似问题