首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >旋转块的6面

旋转块的6面
EN

Stack Overflow用户
提问于 2011-10-25 20:53:06
回答 1查看 281关注 0票数 6

我一直在跟踪黑兹曼的XNA教程,我有一个基本对象,它有一个位置(Vector3)和一个旋转(四元数)。对象模型如下所示

在本教程中的相机实现中,我复制了旋转和旋转方法,并在对象上实现了这些方法

代码语言:javascript
复制
public virtual void Rotate(Vector3 axis, float angle)
{
    axis = Vector3.Transform(axis, Matrix.CreateFromQuaternion(Rotation));
    Rotation = Quaternion.Normalize(Quaternion.CreateFromAxisAngle(axis, angle) * Rotation);
}

public virtual void Revolve(Vector3 target, Vector3 axis, float angle)
{
    Vector3 revolveAxis = Vector3.Transform(axis, Matrix.CreateFromQuaternion(Rotation));

    Quaternion rotate = Quaternion.Normalize(Quaternion.CreateFromAxisAngle(revolveAxis, angle));

    Position = Vector3.Transform(Position - target, Matrix.CreateFromQuaternion(rotate)) + target;

    Rotate(axis, angle);
}

我的块对象创建了6个Quad实例,并对每个Quad对象调用render方法,我在每个Quad上分配了偏移和旋转,以形成一个纹理块,如下所示:

现在我们有了实际的问题,调用my Block对象上的旋转会导致对象本身改变旋转,而我的Quad对象不会旋转,因此我在块对象上实现了一个新的旋转函数。

代码语言:javascript
复制
public override void Rotate(Vector3 axis, float angle)
{
    for (int i = 0; i < mySides.Length; i++)
    {
        Quad side = mySides[i];
        side.Revolve(this.Position, axis, angle);
    }
}

然而,这并没有给我预期的结果,如下所示:

错误的解决方案

下面的解决方案将工作,但将不是很通用的,并将受到限制:一堆的if语句,检查什么轴,我想旋转,然后旋转每一方(四物体)的正确方式。

适当的解决方案

或者,我可以使Quad对象的呈现依赖于块对象(它们的父对象)的旋转,但我不确定如何做到这一点。

第三个也是最后一个选项是让旋转方法将每个Quad对象的旋转和位置更新为正确的值,这一点我不确定如何做到。

问题

因此,我想要的是关于这个的一些想法或想法,也许是一些链接和/或教程来解释如何在XNA中使用四元数,最好是以一种直观的方式。

干杯,期待你的投入:)

EN

回答 1

Stack Overflow用户

发布于 2011-10-25 21:26:18

您应该做的事情,以及您提到的这一点,使得Quad对象的呈现依赖于父对象的旋转。

这对于像你这样的等级系统来说是相当容易的。当您的呈现程序去呈现该块时,它应该将该块的转换存储在一个矩阵中,让我们称之为BlockWorld。当你呈现每个四边形时,用BlockWorld来乘以这个四边形的局部变换。

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

https://stackoverflow.com/questions/7895726

复制
相关文章

相似问题

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