gpt4 book ai didi

c# - 旋转方 block 的 6 个面

转载 作者:太空狗 更新时间:2023-10-29 21:55:23 25 4
gpt4 key购买 nike

我一直在关注 The Hazy Mind 的 XNA 教程 我有一个基础对象,它有一个位置 (Vector3) 和一个旋转 (Quaternion)。对象模型看起来像这样 Class Diagram

根据教程中的相机实现,我复制了 Rotation 和 Revolve 方法并将它们实现在对象上

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);
}

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

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

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);
}
}

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

Block object rotated

错误的解决方案

以下解决方案可行,但不是很通用并且会受到限制:一堆 if 语句检查我想围绕哪个轴旋转,然后以正确的方式旋转每一边(Quad 对象)。

正确的解决方案

或者,我可以使 Quad 对象的渲染依赖于 Block 对象(它们的父对象)的旋转,但我不确定如何执行此操作。

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

问题

所以我要的是关于此的一些想法或想法,也许一些链接和/或教程解释了如何在 XNA 中使用四元数,最好以可视化的方式。

干杯,期待您的意见:)

最佳答案

您应该做什么,您也提到了这一点,使 Quad 对象的渲染依赖于父对象的旋转。

使用像您这样的分层系统,这很容易做到。当您的渲染器开始渲染 block 时,它应该将 block 的变换存储在矩阵中,我们称它为 BlockWorld。当您渲染每个四边形时,将四边形的局部变换乘以 BlockWorld

关于c# - 旋转方 block 的 6 个面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7895726/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com