WPF 和 3D 如何更改 3D 空间中的单个位置点?

2023-12-29

我在 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);
        }
    }

但视觉屏幕上什么也没有发生……

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

但如果这是唯一的方法那么我想我必须研究一下

谢谢你提供的所有帮助。

Mark


好吧,我明白了,这是因为 Geometry3D.Positions 返回 Point3D 对象的集合,这些对象是结构体,因此当您引用它们时,您并没有更改您认为要更改的对象...

所以一个更像这样的循环就可以达到目的:

        for (var i = 0; i < positions.Count; i++)
        {
            Point3D position = positions[i];
            position.Z += 5;
            positions[i] = position;
        }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

WPF 和 3D 如何更改 3D 空间中的单个位置点? 的相关文章

随机推荐

  • 如何在 Visual Studio 2010 中添加 ASP.NET MVC 3 Web 应用程序?

    我的VS 2010如下 微软视觉工作室 2010 版本 10 0 30319 1 RTMRel Microsoft NET Framework 版本 4 0 30319 RTMRel 安装版本 旗舰版 ASP NET MVC 3 Web 应
  • 如何从 IntelliJ IDEA 内部重命名本地 Git 分支?

    您可以使用 IntelliJ IDEA 的 Git 插件做很多事情 但我还没有找到重命名分支的方法 有吗 我知道我总是可以打开终端并执行git branch m source target 但我也希望找到一个 GUI 解决方案 此功能有几个
  • Spring Boot计划任务不适用于docker容器

    我的 Spring Boot 项目在 docker 容器上运行时遇到问题 如果我以恶魔化方式运行容器 docker run d 当我在后台运行非图像时 一切正常 不幸的是 我必须将其作为妖魔化来运行 并且我不知道如何解决该问题 感谢您提供任
  • 使用“this->”的性能损失?

    考虑 C 类中两个类似的 C 成员函数的示例 void C function Foo new f f new f and void C function Foo new f this gt f new f 这些函数的编译方式是否相同 使用是
  • 释放内存的重要性? [复制]

    这个问题在这里已经有答案了 可能的重复 当 malloc 之后不释放时 到底会发生什么 https stackoverflow com questions 654754 what really happens when you dont f
  • MASM:在 .data 声明中使用当前位置计数器 ($)

    我遇到了有关 MASM 中当前位置计数器的问题 这是我的汇编代码 我使用 Visual Studio 2013 Express 进行汇编 386 model flat stdcall stack 8192 ExitProcess proto
  • 使用 JavaScript 读取 CSS 值

    这有效 div style width 100 div 这确实not work div div 我也尝试过将 css 样
  • 如何避免重复将大文件加载到Python脚本中?

    我编写了一个 python 脚本来获取一个大文件 一个矩阵 50k 行 X 500 列 并将其用作数据集来训练随机森林模型 我的脚本有两个函数 一个用于加载数据集 另一个用于使用所述数据训练随机森林模型 这些都工作得很好 但文件上传大约需要
  • 使用 Node.js 设置 SSL

    我在 GoDaddy 购买了 SSL 证书 并使用以下 node js 服务器尝试设置它 var https require https module for https fs require fs required to read cer
  • 使用 Oracle 客户端 64 位和 Visual Studio 2010 时出现 BadImageFormatException!

    我们的一名开发团队成员遇到了错误 尝试加载 Oracle 客户端库抛出 BadImageFormatException 它似乎 当在 64 位模式下运行并安装了 32 位 Oracle 客户端组件时 会出现此问题 但配置系统的是我 以下是规
  • 点击事件被列表视图父项捕获

    我正在编写一个在 Firemonkey 中使用的自定义开关对象TListView每个项目的控制 除了一个奇怪的故障之外 一切都按预期进行 当用户单击其中一项而不是特定的开关对象时 它无论如何都会切换开关 我假设MouseDown当用户单击列
  • R 数据帧聚合列表

    我确实有 53 个数据框 purchase01 到purchase53 的列表 按日期排序 有 18 个变量和不同的行数 已尝试 但无法在下面粘贴示例 我想要总计的每个不同的数据帧通过其重复值 V9 因子 与列 V2 数字相加 我还没找到答
  • AFHTTPRequestOperationManager 返回块中的数据

    我在我的应用程序中创建了一个 APIController 它有几个方法可以调用特定的 api url 并返回一个用 api 调用结果填充的模型对象 该 API 使用 json 到目前为止我的代码如下所示 Definition MyModel
  • 自定义单元格:致命错误:在展开可选值时意外发现 nil

    我有一个带有创建为 xib 的自定义单元格的表格视图 我没有使用故事板 我有一个问题 我无法用来自网络服务结果的数据填充我的表 另外 我在自定义单元格中有 4 个标签 在我的自定义单元类中 当我尝试为每个项目设置标签时 它给了我如上所述的致
  • Django从apache获取环境变量

    我似乎无法让 Django 读取我从环境变量中配置的设置 我遵循了一些在线指南 并发现了一些其他问题 因此尝试配置如下 阿帕奇配置 WSGIScriptAlias v4 usr local myproject4 myproject4 wsg
  • 如何在 ASP.NET DataRepeater 控件中执行条件逻辑?

    我将 DataRepeater 控件绑定到具有许多列的表 我只想显示其中的一个子集 具体取决于填充的内容 我应该如何 在哪里进行数据中继器中的条件测试 这是我的 itemtemplate 中的代码 我得到的错误是 CS0103 名称 容器
  • 尝试从 python 写入 cassandra 时 CQL 查询中出现语法错误

    因此 我正在用 python 构建一个应用程序 该应用程序从 twitter 获取数据 然后将其保存到 cassandra 我当前的问题在于一个从kafka读取数据并尝试将其写入cassandra的脚本 如下所示 import thread
  • scala会自动关闭InputStream吗?

    我是 scala 的新手 不熟悉流关闭机制 我写了一些这样的代码 def loadResourceAsString path String val is this getClass getResourceAsStream path Sour
  • 过滤字符串列表,忽略其他项目的子字符串

    如何过滤包含字符串和子字符串的列表以仅返回最长的字符串 如果列表中的任何项目是另一个项目的子字符串 则仅返回较长的字符串 我有这个功能 有更快的方法吗 def filterSublist lst uniq lst for elem in l
  • WPF 和 3D 如何更改 3D 空间中的单个位置点?

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