首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >围绕模型自己的轴旋转模型

围绕模型自己的轴旋转模型
EN

Stack Overflow用户
提问于 2010-01-11 13:48:59
回答 2查看 16.3K关注 0票数 6

假设我有一个简单的WPF 3D场景,其中一个矩形绕X轴旋转-45度,如下所示:

这为我提供了以下内容:

现在我想将图像旋转45度

模型的Z轴

..。如果我像这样放入第二个RotateTransform3D:

它围绕

场景的

Z轴。对于这个特殊的X旋转,我计算出我需要的是:

但在这一点上,我的数学不及格。谁能告诉我如何计算任意旋转的"A“(和"B”,如果你愿意)?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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一起使用。

代码语言:javascript
运行
AI代码解释
复制
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;
    }
票数 14
EN

Stack Overflow用户

发布于 2021-02-28 07:26:23

您得出的答案包含三种不同的旋转,提供了可应用于对象的单个变换矩阵。这是可行的,但考虑到问题的措辞,这是不必要的。

在所描述的问题中,您希望平面围绕其Z轴旋转,但随后旋转的结果是围绕

场景的

X轴,如下所示:

这是将你想出的转换添加到原始转换的结果,即使用如下所示的分组转换:

问题是,你实际上首先遇到的唯一问题是,你以错误的顺序组合了原始变换,至少在上述问题的情况下是这样的。只需插入Z轴旋转即可实现完全相同的结果

之前

X轴旋转,而不是之后:

事实上,你在你的答案中发布的方法实际上只是完成相同作文的另一种方式。如果您将

从调用您的方法返回的值,传递

,即

方法返回的值基本上是相同的。

属性用于如上所述声明(或在代码隐藏中初始化)的组。

它看起来是一种不同的方法的唯一原因是,在直接处理矩阵数学时(正如您的方法所做的那样),与使用

对象进行组合(因为该对象颠倒了组合,以便它在XAML声明中更自然地出现)。

(我说“本质上”,是因为由于计算四元数的额外步骤引入的舍入误差,在一些矩阵分量中存在非常微小的差异。例如,当对旋转进行分组时,

组件具有值

,而使用您的方法的相同组件有价值

..。矩阵不会进行完全相同的比较,但它们在应用于场景中的对象时具有完全相同的视觉效果。)

现在,在代码隐藏中计算矩阵没有任何问题,如果这是您的代码需要架构的方式。使用四元数是一种行之有效的方法,特别是对于在两个不同旋转之间进行插值的目的(即,您希望为旋转设置动画并为此轻松计算中间旋转)。

但我认为重要的是要理解,并没有真正的“围绕自己的轴旋转一个物体”这样的东西。对象的变换总是相对于它所在的坐标空间发生,而不是相对于它自己的局部坐标空间。当对象相对于其父对象(无论是整个场景、顶级对象,还是场景中第一个对象是其子对象的某个其他对象)进行旋转或变换时,都会始终移动后者以保持与对象本身对齐。

在WPF中有许多不同的方法来组成3D变换矩阵,但它们实际上都归结为一件事:将两个或更多个矩阵相乘以得到最终的一个。甚至在通过场景对象图中的父/子关系将变换应用于不同对象时也是如此。事实上,在3D渲染API中,使用对象的层次关系更为惯用

如果您打算让给定对象仅围绕其自身的单个轴旋转

..。也就是说,在您的示例中,您可以为对象指定一个父对象,将X轴旋转应用于该父对象,然后仅将Z轴旋转应用到子对象。

例如,像这样的东西:

同样,同样的结果,只是用不同的方式来表示矩阵的组成。在这种情况下,这将是表示变换的一种更自然的方式,在这种情况下,渲染的平面应该只围绕“它自己的”Z轴旋转,但仍然相对于场景中也移动和/或旋转的某些父对象移动和/或旋转(例如,关节机械臂上的手、汽车上的轮子或某些作战车辆上的角楼,举几个经常出现在3D渲染场景中的示例)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2042214

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档