English 中文(简体)
围绕自己的轴线绘制模型
原标题:Rotate a model around its own axes

附录一有一个简单的WPF 3D场景,由单一试金星轮到45度左右,如:

<Viewport3D>
    <Viewport3D.Camera>
        <PerspectiveCamera Position="0,0,4"/>
    </Viewport3D.Camera>
    <ModelVisual3D>
        <ModelVisual3D.Content>
            <DirectionalLight Color="White" Direction="-1,-1,-3" />
        </ModelVisual3D.Content>
    </ModelVisual3D>
    <ModelVisual3D>
        <ModelVisual3D.Content>
            <GeometryModel3D>
                <GeometryModel3D.Geometry>
                    <MeshGeometry3D Positions="-1,-1,0  1,-1,0  -1,1,0  1,1,0"
                                    TriangleIndices="0,1,2 1,3,2"/>
                </GeometryModel3D.Geometry>
                <GeometryModel3D.Material>
                    <DiffuseMaterial Brush="Red"/>
                </GeometryModel3D.Material>
            </GeometryModel3D>
        </ModelVisual3D.Content>
        <ModelVisual3D.Transform>
            <Transform3DGroup>
                <RotateTransform3D>
                    <RotateTransform3D.Rotation>
                        <AxisAngleRotation3D Axis="1,0,0" Angle="-45"/>
                    </RotateTransform3D.Rotation>
                </RotateTransform3D>
            </Transform3DGroup>
        </ModelVisual3D.Transform>
    </ModelVisual3D>
</Viewport3D>

这使我感到:

“rotated

现在我想在model s Z axis周围传承45度的形象。 如果我这样说,我就这样说:

<RotateTransform3D>
    <RotateTransform3D.Rotation>
        <AxisAngleRotation3D Axis="0,0,1" Angle="45"/>
    </RotateTransform3D.Rotation>
</RotateTransform3D>

会议围绕scene s轮流举行。 Z axis。 为了进行这种轮值,我先确定我所需要的是:

<RotateTransform3D>
    <RotateTransform3D.Rotation>
        <AxisAngleRotation3D Axis="0,1,1" Angle="45"/>
    </RotateTransform3D.Rotation>
</RotateTransform3D>

但在此,我的数分数没有我。 任何人能否告诉我,如果你愿意的话,如何为任意轮换“A”和“B”而努力?

最佳回答

Ok与一位数学朋友交谈,他给我回答:

so i think what you need to do if you re rotating around the vector (1,0,0) by an angle of a (i.e rotating around the x-axis so transforming your object in the y-z plane).

进一步的轮换围绕在进行。

x - (1,00) 保持不变!

y - (0,cosa,sina)

z - (0,-sina,cosa)

a similar principle will hold for rotations in the x-z plane (0,1,0)

x - (sina,0, cosa)

iii

z - (sina,o,cosa)

(0,0,1)

x - (sina,cosa,0)

y - (cosa,sina,0)

z - (0,0,1)

TADA!

最新资料:我设立了一个职能,计算一个矩阵,在所有三个轴心中轮换一个物体。 可以用汇总表Transform3D加以利用。

    Matrix3D CalculateRotationMatrix(double x, double y, double z)
    {
        Matrix3D matrix = new Matrix3D();

        matrix.Rotate(new Quaternion(new Vector3D(1, 0, 0), x));
        matrix.Rotate(new Quaternion(new Vector3D(0, 1, 0) * matrix, y));
        matrix.Rotate(new Quaternion(new Vector3D(0, 0, 1) * matrix, z));

        return matrix;
    }
问题回答

你的回答是三个不同的轮任,提供了一种可以适用于物体的单一转变矩阵。 这样做,但鉴于问题的措辞,它没有必要。

在所描述的问题中,你希望飞机就其轴心进行轮换,但轮班结果在scene s上轮值。 X轴:

“继两次轮换后”/

由此,你们的变革产生于原来的变革,即集体转变:

<Transform3DGroup>
  <RotateTransform3D>
    <RotateTransform3D.Rotation>
      <AxisAngleRotation3D Axis="1,0,0" Angle="-45"/>
    </RotateTransform3D.Rotation>
  </RotateTransform3D>
  <RotateTransform3D>
    <RotateTransform3D.Rotation>
      <AxisAngleRotation3D Axis="0,1,1" Angle="45"/>
    </RotateTransform3D.Rotation>
  </RotateTransform3D>
</Transform3DGroup>

问题在于,你实际上首先存在的唯一问题,至少鉴于问题,是你以错误的次序组成了最初的变革。 仅通过插入Z-axis的轮换 <> <>>> 之前,你就能够取得完全相同的结果。 X-轴旋转,而不是:

<Transform3DGroup>
  <RotateTransform3D>
    <RotateTransform3D.Rotation>
      <AxisAngleRotation3D Axis="0,0,1" Angle="45"/>
    </RotateTransform3D.Rotation>
  </RotateTransform3D>
  <RotateTransform3D>
    <RotateTransform3D.Rotation>
      <AxisAngleRotation3D Axis="1,0,0" Angle="-45"/>
    </RotateTransform3D.Rotation>
  </RotateTransform3D>
</Transform3DGroup>

确实,你在你的回答中所采用的方法实际上只是实现相同组成的一种不同方式。 比较<条码>Matrix3D 经由<条码>-45和<条码>45,即<条码>的计算法> 2. 上文所申报的(或以编码为正本的)群体的财产。

似乎另一种做法的唯一理由是,在直接处理矩阵数学时,组成顺序不同(如您的方法),而使用<代码>Transform3DGroup则反对组成(因为反对推翻组成,从而更自然地出现在XAML声明中)。

(我说,“基本上”是因为计算伤员的附加步骤带来了四舍五入的错误,因此,一些矩阵组成部分存在非常小的差别。) 例如,在分类轮值时,M12构成部分有价值0.5<>>>>>,而使用您方法的同一组成部分有价值0.499999999999999999999999989<>。 矩阵获得的图象是相同的,但在现场应用物体时,其直观效应完全相同。

现在,如果计算编码背后的矩阵,就根本不会错过了,这样就需要设计你的代码。 而使用标准是一种尝试和真实的做法,特别是为了在两种不同的轮换之间进行干涉(即,你想要把轮换同为目的进行中间轮换混为一谈)。

但我认为必须理解的是,没有真正的东西,例如“围绕自己的轴心转移物体”。 物体的转化总是与其在当地的协调空间相对应。 后者总是被移至与物体本身保持一致,任何物体被轮换或变换时都与其父母相对(无论是整个场面,还是顶级物体,还是第一个物体是孩子的场内其他物体)。

世界森林论坛在组成3D转变矩阵方面有多种不同的方式,但所有这些方式实际上都属于同一个方面:将两个或两个以上的矩阵合并成最后一个。 即便在物体图表中通过母子关系对不同的物体进行转化,情况也是如此。 事实上,如果您打算对某一物体只轮换其自己的的单一轴心,那么在3D中,它就更具有实用性。 例如,你本可以把X-轴旋转的母物体交给你,然后将Z-轴旋转至儿童物体。

例如:

<!-- Parent 3D visual -->
<ModelVisual3D>
  <ModelVisual3D.Transform>
    <RotateTransform3D>
      <RotateTransform3D.Rotation>
        <AxisAngleRotation3D Axis="1,0,0" Angle="-45"/>
      </RotateTransform3D.Rotation>
    </RotateTransform3D>
  </ModelVisual3D.Transform>
      
  <!-- Child 3D visual -->
  <ModelVisual3D>
    <ModelVisual3D.Content>
      <GeometryModel3D>
        <GeometryModel3D.Geometry>
          <MeshGeometry3D Positions="-1,-1,0  1,-1,0  -1,1,0  1,1,0"
                                TriangleIndices="0,1,2 1,3,2"/>
        </GeometryModel3D.Geometry>
        <GeometryModel3D.Material>
          <DiffuseMaterial Brush="Red"/>
        </GeometryModel3D.Material>
      </GeometryModel3D>
    </ModelVisual3D.Content>

    <ModelVisual3D.Transform>
      <RotateTransform3D>
        <RotateTransform3D.Rotation>
          <AxisAngleRotation3D Axis="0,0,1" Angle="45"/>
        </RotateTransform3D.Rotation>
      </RotateTransform3D>
    </ModelVisual3D.Transform>
  </ModelVisual3D>
</ModelVisual3D>

同样确切的结果,只是表达矩阵构成的不同方式。 在此情况下,如果被遗赠的飞机只想轮换“自己的”Z-轴,但相对于在现场流动和(或)轮换的一些父母而言,这种转变是一种更自然的方式(例如,手指一个明确的机器手臂、一辆汽车上的轮).或某些作战车辆的旋涡,以举出在3Drendered场经常出现的几个例子)。





相关问题
WPF convert 2d mouse click into 3d space

I have several geometry meshes in my Viewport3D, these have bounds of (w:1800, h:500, d:25). When a user clicks in the middle of the mesh, I want the Point3D of (900, 500, 25)... How can I achieve ...

Editing a xaml icons or images

Is it possible to edit a xaml icons or images in the expression design or using other tools? Is it possible to import a xaml images (that e.g you have exported) in the expression designer for editing?...

WPF: writing smoke tests using ViewModels

I am considering to write smoke tests for our WPF application. The question that I am faced is: should we use UI automation( or some other technology that creates a UI script), or is it good enough to ...

WPF - MVVM - NHibernate Validation

Im facing a bit of an issue when trying to validate a decimal property on domain object which is bound to a textbox on the view through the viewmodel. I am using NHibernate to decorate my property on ...

How do WPF Markup Extensions raise compile errors?

Certain markup extensions raise compile errors. For example StaticExtension (x:Static) raises a compile error if the referenced class cannot be found. Anyone know the mechanism for this? Is it baked ...

WPF design-time context menu

I am trying to create a custom wpf control, I m wondering how I can add some design-time features. I ve googled and can t seem to get to my goal. So here s my simple question, how can I add an entry ...

How to combine DataTrigger and EventTrigger?

NOTE I have asked the related question (with an accepted answer): How to combine DataTrigger and Trigger? I think I need to combine an EventTrigger and a DataTrigger to achieve what I m after: when ...