gpt4 book ai didi

c# - WPF 和 3D 如何改变 3D 空间中的单个位置点?

转载 作者:行者123 更新时间:2023-11-30 16:35:41 25 4
gpt4 key购买 nike

我在 WPF 中定义了一个非常简单的 3D 空间,它定义了一个 3D 矩形,我希望能够操作 MeshGeometry3D 上的每个 Point3D 对象(在“位置”中)属性,但我遇到了麻烦用它...

这是我的 XAML:

<Grid>
<Viewport3D Name="ViewPort"
Focusable="true"
ClipToBounds="true"
Width="{Binding Width, ElementName=canvas, Mode=Default}"
Height="{Binding Height, ElementName=canvas, Mode=Default}">
<Viewport3D.Camera>
<PerspectiveCamera Position="0,0,5"/>
</Viewport3D.Camera>
<ModelVisual3D>
<ModelVisual3D.Content>
<Model3DGroup>
<PointLight Color="White" Position="0,0,0">
<PointLight.Transform>
<Transform3DGroup>
<TranslateTransform3D OffsetX="0" OffsetY="0" OffsetZ="0"/>
<ScaleTransform3D ScaleX="1" ScaleY="1" ScaleZ="1"/>
<RotateTransform3D d:EulerAngles="0,0,0">
<RotateTransform3D.Rotation>
<AxisAngleRotation3D Angle="0" Axis="0,1,0"/>
</RotateTransform3D.Rotation>
</RotateTransform3D>
<TranslateTransform3D OffsetX="0" OffsetY="0" OffsetZ="2"/>
</Transform3DGroup>
</PointLight.Transform>
</PointLight>

<GeometryModel3D x:Name="model1" Material="{DynamicResource test1}">
<GeometryModel3D.Transform>
<Transform3DGroup>
<RotateTransform3D>
<RotateTransform3D.Rotation>
<AxisAngleRotation3D Axis="1,0,0" Angle="5" />
</RotateTransform3D.Rotation>
</RotateTransform3D>
<RotateTransform3D>
<RotateTransform3D.Rotation>
<AxisAngleRotation3D Axis="0,1,0" Angle="-5" />
</RotateTransform3D.Rotation>
</RotateTransform3D>
</Transform3DGroup>
</GeometryModel3D.Transform>
<GeometryModel3D.Geometry>
<MeshGeometry3D
Positions=" -0.5, 0.5, 0.0
-0.5, -0.5, 0.0
1.5, -0.5, 0.0
1.5, 0.5, 0.0"
TextureCoordinates="0,0 0,1 1,1 1,0"
TriangleIndices="0 1 2 2 3 0" />
</GeometryModel3D.Geometry>
</GeometryModel3D>
</Model3DGroup>
</ModelVisual3D.Content>
</ModelVisual3D>
</Viewport3D>
<Canvas Background="Transparent" Grid.Column="0" Grid.Row="0" x:Name="canvas" s:Contacts.ContactDown="canvas_ContactDown" Width="{Binding Width, ElementName=window, Mode=Default}" Height="{Binding Height, ElementName=window, Mode=Default}">
</Canvas>
</Grid>

其中 test1 只是一个包裹在视觉画笔中的图像。

这是我的 C#:

private void canvas_ContactDown(object sender, ContactEventArgs e)
{
//Point contactPosition = e.GetPosition(this);
//var rayMeshResult = (RayMeshGeometry3DHitTestResult)VisualTreeHelper.HitTest(ViewPort, e.GetPosition(ViewPort));
translatedX -= 0.25;
translatedY -= 0.25;
model1.Transform = new TranslateTransform3D(translatedX, translatedY, 0.0);
//model1.Transform.Transform(new Point3D(translatedX, translatedY, 0.0));

Console.WriteLine("Changed");
//Apply Z index changes here...
var geometry3D = model1.Geometry as MeshGeometry3D;
Point3DCollection positions = geometry3D.Positions;

foreach (var position in positions)
{
position.Offset(0,0,-15);
}
}

但是在可视屏幕上没有任何反应......

我想特别提到的一件事是,我不想对整个对象应用转换,一次只对一个点应用转换。

但如果那是唯一的方法,那么我想我必须调查一下

感谢您提供的任何帮助。

标记

最佳答案

好的,我明白了,这是因为 geometry3D.Positions 返回了 Point3D 对象的集合,这些对象是结构体,所以当您引用它们时,您并没有改变您认为正在改变的对象...

所以一个更像这样的循环就可以了:

        for (var i = 0; i < positions.Count; i++)
{
Point3D position = positions[i];
position.Z += 5;
positions[i] = position;
}

关于c# - WPF 和 3D 如何改变 3D 空间中的单个位置点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1592136/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com