我需要在C#中的轴上旋转3D网格物体 你能告诉我这是怎么做到的吗?
答案 0 :(得分:10)
用旋转矩阵
乘以所有顶点
答案 1 :(得分: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#:
中this.rotation.Angle = 90;
如果你使用XNA,你会使用类似Matrix.CreateRotationY之类的内容,并将其应用于ModelMesh实例。
当然,你可以利用大量的第三方引擎和apis。一个有趣的选择可能是SlimDX,它是Direct3D的一个纤薄的包装,有点像Managed DirectX。
答案 2 :(得分:1)
让我们详细介绍一下。
考虑到旋转角度和旋转轴的规格,我们可以在几个步骤中完成旋转。
代码是读者的练习,因为这是对我的大脑训练(计算机图形很久以前:d)。也许当我为它做准备时,我会发布更多信息。
我相信它是这样的: R(θ)= T ^ -1。 Rx ^ -1(alpha)。 Ry ^ -1(Beta)。 Rz(theta)。 Ry(测试版)。 Rx(alpha)。 Ť
其中:
脑训练师编辑
我们可以简化(即使不使用季度)
(来源:gamedev.net)
alt text http://www.gamedev.net/reference/articles/1199/image010.gif
和(x,y,z)是旋转轴上的单位矢量,是旋转角度。
如果我可能相信谷歌。这个证明留给了读者一个练习,但据我所知,我认为它是正确的(来源:Graphics Gems(Glassner,Academic Press,1990)。)
答案 3 :(得分:1)
我有类似的问题。我不确定你想要旋转什么,但我们假设您想要转换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]);
}
答案 4 :(得分:0)