如何在C# 3D中旋转一个物体?

4

我需要在C#中沿着一个轴旋转一个3D网格对象。
你能展示一下如何实现吗?


1
也许您可以展示一些代码,这样我们才能使用正确的类等来回答。 - GraemeF
5个回答

10

将所有顶点乘以旋转矩阵

alt text


2
我猜“on an axis”的翻译意思是围绕某个预定义的轴旋转。因此,请不要忘记翻译,因为这些矩阵没有内置的平移向量,所以会围绕原点旋转。 - bastijn
我该如何使用C# WinForms制作这个? - FindOutIslamNow

2
“这取决于您想使用哪个API:”
“在WPF中,您可以这样做:”
   <Viewport3D>
       <Viewport3D.Camera>
          <PerspectiveCamera Position="-40,40,40" LookDirection="40,-40,-40 " 
                             UpDirection="0,0,1" />
       </Viewport3D.Camera>
       <ModelVisual3D>
          <ModelVisual3D.Content>
             <Model3DGroup>
                <DirectionalLight Color="White" Direction="-1,-1,-3" />
                   <GeometryModel3D>
                   <Model3DGroup.Transform>
                      <RotateTransform3D>
                          <RotateTransform3D.Rotation>
                                <!-- here you do the rotation -->
                                <AxisAngleRotation3D x:Name="rotation" Axis="0 0 1" Angle="45" />
                            </RotateTransform3D.Rotation>
                        </RotateTransform3D>
                      </Model3DGroup.Transform>
                      <GeometryModel3D.Geometry>
                         <MeshGeometry3D Positions="0,0,0 10,0,0 10,10,0 0,10,0 0,0,10 
                            10,0,10 10,10,10 0,10,10"
                            TriangleIndices="0 1 3 1 2 3  0 4 3 4 7 3  4 6 7 4 5 6 
                                             0 4 1 1 4 5  1 2 6 6 5 1  2 3 7 7 6 2"/>
                      </GeometryModel3D.Geometry>
                      <GeometryModel3D.Material>
                         <DiffuseMaterial Brush="Red"/>
                      </GeometryModel3D.Material>
                   </GeometryModel3D>
                </Model3DGroup>
             </ModelVisual3D.Content>
          </ModelVisual3D>
    </Viewport3D>

在C#的代码后台中,或者说在C#的后端代码中:
this.rotation.Angle = 90;

如果您使用XNA,您可以使用类似于Matrix.CreateRotationY的东西,并将其应用于您的ModelMesh实例。
当然,还有很多第三方引擎和API可供使用。一个有趣的选择可能是SlimDX,它是Direct3D的轻量级封装,有点像以前的Managed DirectX。

2

我遇到过类似的问题。我不确定您想要旋转什么,但假设您想要转换一个MeshGeometry3D对象。以下是我的解决方案。

    public void RotateMesh(MeshGeometry3D mesh, Vector3D axis, double angle)
    {
        var transform = new RotateTransform3D(); 
        transform.Rotation = new AxisAngleRotation3D(axis, angle);

        for (int i = 0; i < mesh.Positions.Count; ++i) 
            mesh.Positions[i] = transform.Transform(mesh.Positions[i]);
    }

1

让我们加入更多的细节。

给定旋转角度和旋转轴的规格,我们可以通过几个步骤完成旋转。

  1. 将对象平移,使旋转轴通过坐标系原点
  2. 旋转对象,使旋转轴与其中一个坐标轴重合
  3. 执行指定的绕选定坐标轴旋转。
  4. 应用逆旋转将旋转轴带回其原始方向。
  5. 应用逆平移将旋转轴带回其原始空间位置。

代码是读者的练习,因为这对我来说是一种大脑训练(计算机图形学是很久以前的事情 :d)。也许当我准备好时,我会发布更多内容。

我相信它是这样的:

R(theta) = T^-1 . Rx^-1(alpha) . Ry^-1(Beta) . Rz(theta) . Ry(beta) . Rx(alpha) . T

其中:

  • T = 平移矩阵
  • Rx = 绕x轴旋转等

大脑训练编辑

哦,我们可以简化它(甚至不使用四元数)

alt text
(来源:gamedev.net

alt text

而 (x,y,z) 是旋转轴上的单位向量,θ 是旋转角度。

如果我可以相信 Google。证明留给读者作为练习,但我认为就我所见,它是正确的(来源:Graphics Gems(Glassner,Academic Press,1990年)。)


0
你可以使用开源库Skiasharp
查看这个代码以了解如何操作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接