如何在 C# 3D 中旋转对象?

发布于 2024-08-11 03:40:08 字数 49 浏览 4 评论 0原文

我需要在 C# 中的轴上旋转 3D 网格对象。
你能告诉我这是如何做到的吗?

I need to rotate an 3D mesh object on an axis in C#.
Could you show me how this is done?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

宛菡 2024-08-18 03:40:08

将所有顶点乘以旋转矩阵

alt text

Multiply all vertexes by rotation matrix

alt text

悍妇囚夫 2024-08-18 03:40:08

这取决于您想要使用什么 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# 中:

this.rotation.Angle = 90;

如果您使用 XNA,您将使用类似 Matrix.CreateRotationY 并将其应用到您ModelMesh 实例。

当然,您可以使用大量的第三方引擎和 API。一个有趣的选择可能是 SlimDX,它是 Direct3D 的一个薄包装,有点像以前的 Managed DirectX。

It depends what API you want to use:

In WPF you could do it like this:

   <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>

Or in codebehind c#:

this.rotation.Angle = 90;

If you use XNA you would use soemthing like Matrix.CreateRotationY and apply that to you ModelMesh instance.

Of course there are tons of 3rd party engines and apis that you could utilize. AN interesting choice might be SlimDX which is a slim wrapper around Direct3D sort of like Managed DirectX once was.

请别遗忘我 2024-08-18 03:40:08

我有类似的问题。我不确定您想要旋转什么,但假设您想要变换 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]);
    }

I had a similar problem. I'm not sure what you want to rotate, but lets assume you want to transform a MeshGeometry3D. Here is my solution.

    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]);
    }
∝单色的世界 2024-08-18 03:40:08

让我们对此进行更多详细说明。

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

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

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

我相信它是这样的:
R(θ) = T^-1 。 Rx^-1(α) 。 Ry^-1(测试版)。 Rz(θ) 。 Ry(测试版)。接收(阿尔法)。 T

其中:

  • T = 平移矩阵
  • Rx = 关于 x 等的旋转

大脑训练器编辑

O 我们可以简化(即使不使用四分法)

alt text
(来源:gamedev.net)

alt text

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

如果我可以相信谷歌的话。该证明留给读者作为练习,但据我所知,我相信它是正确的(来源:Graphics Gems(Glassner,Academic Press,1990)。)

Lets put some more detail in this.

Given the specifications for the rotation angle and rotation axis we can accomplish the rotation in a few steps.

  1. Translate the object so that the rotation axis passes through the coordinate system origin
  2. Rotate the object so that the axis of rotation coincides with one of the coordinate axes
  3. Perform the specified rotation about the selected coordinate axis.
  4. Apply inverse rotations to bring the rotation axis back to its original orientation.
  5. Apply the inverse translation to bring the rotation axis back to its original spatial position.

The code is an exercise for the reader as this is a brain training for me (computer graphics is a long time ago :d). Maybe when I'm up for it I'll post a bit more.

I believe it was something like:
R(theta) = T^-1 . Rx^-1(alpha) . Ry^-1(Beta) . Rz(theta) . Ry(beta) . Rx(alpha) . T

Where:

  • T = translation matrix
  • Rx = rotation about x etc

Brain trainer edit

O we can simplify (even without using quarternations)

alt text
(source: gamedev.net)

alt text

and (x,y,z) is a unit vector on the axis of rotation and is the angle of rotation.

if I may believe google. The prove is left as an exercise to the reader but I believe it is correct as far as I can see (source: Graphics Gems (Glassner, Academic Press, 1990).)

╰つ倒转 2024-08-18 03:40:08

您可以使用 Skiasharp ,开源库

检查这个代码 了解如何执行此操作。

You can use Skiasharp, the open source library

Check this code for how to do it.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文