【问题标题】:How to find the transformed point3d coordinates of a transformed ModelVisual3D如何找到转换后的 ModelVisual3D 的转换后的 point3d 坐标
【发布时间】:2009-09-07 20:30:59
【问题描述】:

我想单击 Viewport3D 中的模型并找到模型的 3D 坐标。我想要转换后的坐标。

假设你在 Viewport3D 中有这个:

<ModelVisual3D x:Name="yellowTriangle">
 <ModelVisual3D.Content>
  <GeometryModel3D>
   <GeometryModel3D.Geometry>
    <MeshGeometry3D Positions="-1,0,0 0,1,0 1,0,0" TriangleIndices="0,2,1"/>
   </GeometryModel3D.Geometry>
   <GeometryModel3D.Transform>
    <Transform3DGroup>
     <TranslateTransform3D OffsetX="10" OffsetY="20" OffsetZ="-10"/>
     <ScaleTransform3D ScaleX="1" ScaleY="1.5" ScaleZ="1"/>
     <RotateTransform3D>
      <RotateTransform3D.Rotation>
       <AxisAngleRotation3D Angle="20" Axis="1 0 0"/>
      </RotateTransform3D.Rotation>
     </RotateTransform3D>
     <TranslateTransform3D OffsetX="0" OffsetY="0" OffsetZ="0"/>
    </Transform3DGroup>
   </GeometryModel3D.Transform>
   <GeometryModel3D.Material>
    <DiffuseMaterial Brush="Yellow"/>
   </GeometryModel3D.Material>
  </GeometryModel3D>
 </ModelVisual3D.Content>

使用 VisualTreehelper.HitTest 我可以得到 MeshGeometry3D 和 Point3D 位置。但是,我只能得到原始的 Point3D:-1,0,0 等。如何获得转换后的 Point3D?

根据Ericsink's autozoom的备注我应该:

从每个 MeshGeometry3D 向上走可视化树并停下来应用它沿途找到的每个 Transform >对象

但我没有成功。任何人都有办法接触到 MeshGeometry3D 的 ModelVisual3D 吗?

或者以更快的方式到达那些转换后的 Point3D?


添加hittest代码:

    private void Viewport3D_MouseDown(object sender, MouseButtonEventArgs e)
    {
        RayMeshGeometry3DHitTestResult rayMeshResult = (RayMeshGeometry3DHitTestResult)
            VisualTreeHelper.HitTest(mainViewport, e.GetPosition(mainViewport));

        if (rayMeshResult.MeshHit is MeshGeometry3D)
        {
            MeshGeometry3D mesh = (MeshGeometry3D)rayMeshResult.MeshHit;
            foreach (Point3D point3d in mesh.Positions)
            {
                MessageBox.Show("original point: " + point3d.ToString());
                Point3D p = new Point3D();
                // Using the Modelhit now because the meshhit doesn't contain a transform
                Transform3D trans = rayMeshResult.ModelHit.Transform;
                p = trans.Transform(point3d);
                MessageBox.Show("transformed point: " + p.ToString());
            }
        }

    }

我清理了我的 hittest 代码,它可以与上面的“yellowTriangle”一起使用。该问题仅出现在我基于 Daniel Lehenbauer 的扩展 Visual3d 的派生 Rectangle3D 代码中:“http://blogs.msdn.com/danlehen/archive/2005/10/16/481597.aspx

这样的事情并没有给我正确的转换:

        <primitive3D:Rectangle3D>
            <primitive3D:Rectangle3D.Material>
                <DiffuseMaterial Brush="Green"/>
            </primitive3D:Rectangle3D.Material>
            <primitive3D:Rectangle3D.Transform>
                <Transform3DGroup>
                    <TranslateTransform3D OffsetX="0" OffsetY="0" OffsetZ="0"/>
                    <ScaleTransform3D ScaleX="1" ScaleY="1" ScaleZ="10"/>
                    <RotateTransform3D>
                        <RotateTransform3D.Rotation>
                            <AxisAngleRotation3D Angle="30" Axis="0 1 0"/>
                        </RotateTransform3D.Rotation>
                    </RotateTransform3D>
                    <TranslateTransform3D OffsetX="0" OffsetY="0" OffsetZ="0"/>
                </Transform3DGroup>
            </primitive3D:Rectangle3D.Transform>

        </primitive3D:Rectangle3D>

我猜我派生的 rectangle3D 应该有一个 DependencyProperty 用于转换?

【问题讨论】:

    标签: .net wpf 3d transform


    【解决方案1】:

    这可能会帮助你得到你想要的 - Transform3DGroup.Transform

    它将允许您使用 TransformGroups 转换来转换一个点或一组点,在您的情况下,要使用的 Transform3DGroup 包含在 GeometryModel3D.Transform 属性中。

    【讨论】:

    • 好吧,我尝试了 Modelhit.Tranform 属性,但它总是给我这个矩阵:1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 将 Transform 属性转换为 Transform3DGroup 会得到 Null
    • 你能发布你的 HitTest 代码和你用来处理结果的回调吗?
    【解决方案2】:

    在做hitTesting的时候,可以在

    中找到一个ModelVisual3D的Transformation matrix
    Transform3D transformOnModelVisual3D = rayMeshResult.VisualHit.Transform;
    

    这对应于设置的变换:

    <ModelVisual3D x:Name="yellowTriangle">
     <ModelVisual3D.Transform>
      <RotateTransform3D>
        <RotateTransform3D.Rotation>
         <AxisAngleRotation3D Angle="60" Axis="0 1 0"/>
        </RotateTransform3D.Rotation>
      </RotateTransform3D>
     </ModelVisual3D.Transform>
    ....
    </ModelVisual3D>
    

    另一个变换可以在

    中找到
    Transform3D transformOnGeometryModel3D = rayMeshResult.ModelHit.Transform;
    

    对应: ...

    <ModelVisual3D.Content>
     <GeometryModel3D>
      <GeometryModel3D.Geometry>
       <MeshGeometry3D Positions="-1,0,0 0,1,0 1,0,0" TriangleIndices="0,2,1"/>
      </GeometryModel3D.Geometry>
      <GeometryModel3D.Transform>
       <Transform3DGroup>
        <TranslateTransform3D OffsetX="-2" OffsetY="1" OffsetZ="-1"/>
       </Transform3DGroup>
      </GeometryModel3D.Transform>
     </GeometryModel3D>
    </ModelVisual3D.Content>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-21
      • 2013-08-20
      • 1970-01-01
      • 2021-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-31
      相关资源
      最近更新 更多