使用 XAML 和 C# 旋转 3D 立方体

ops/2025/2/4 21:43:33/

此示例演示如何使用 XAML 显示和旋转 3D 立方体。它显示一个带有滚动条的蓝色三维立方体,您可以使用滚动条旋转立方体以从不同方向查看它。

下面显示了该程序的完整 XAML 代码。XAML 代码处理所有用户交互,包括旋转立方体,因此该示例不需要任何后台 C# 代码。

窗口包含一个网格,该网格定义了一个大行和大列以及一个小行和小列。滚动条位于网格的细长单元格中。左上角的大单元格包含一个可以显示三维场景的Viewport3D对象。它包含一个ModelVisual3D和一个Camera

ModelVisual3D包含一个Model3DGroup,它定义了一些用于照亮场景的灯光和一个GeometryModel3D  GeometryModel3D定义三维对象的几何形状及其材质。

GeometryModel3D包含一个MeshGeometry3D对象定义立方体。该对象的Positions值给出了立方体顶点在三维空间中的位置。TriangleIndices属性给出了应该用来构成三角形的顶点的索引。例如,TriangleIndices的前三个值是 0、1 和 2,这意味着应该使用索引为 0、1 和 2 的顶点来构成三角形。

请注意,GeometryModel3D只能定义一个几何体和一个材质。这意味着,如果您想要制作多个具有不同材质的物体,例如红色和蓝色立方体或具有不同颜色侧面的单个立方体,那么您需要使用多个GeometryModel3D对象。

Viewport3D 对象的Camera属性定义用于查看三维场景的相机。此示例使用位于 (1.5, 2, 3) 的透视相机回望原点。UpDirection确定相机的倾斜度。在此示例中,相机垂直放置。FieldOfView确定相机可查看的区域有多宽。

此示例使用两个变换来修改相机的位置。第一个变换是围绕 Y 轴的旋转。旋转角度由水平滚动条hscroll的Value属性指定。第二个变换是围绕 X 轴的旋转,旋转角度由垂直滚动条的Value属性指定。

将旋转角度绑定到滚动条的Value属性可让 XAML 代码处理旋转,而无需任何 C# 代码。调​​整滚动条时,旋转角度会更新,立方体会自动旋转。

这看起来可能相当复杂(是的,确实如此),但如果您想构建三维场景,了解这些 XAML 对象的工作原理非常重要。下载示例并花一些时间研究它,然后再继续学习更复杂的 3D 示例。尝试一些实验。例如,尝试添加具有不同颜色的第二个立方体。

下载示例进行试验并查看更多详细信息。

<Window x:Class="howto_xaml_rotate_cube.Window1"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"Title="howto_xaml_rotate_cube" Height="300" Width="330"><Grid><Grid.ColumnDefinitions><ColumnDefinition Width="*"/><ColumnDefinition Width="20"/></Grid.ColumnDefinitions><Grid.RowDefinitions><RowDefinition Height="*"/><RowDefinition Height="25"/></Grid.RowDefinitions><ScrollBar Name="vscroll" Grid.Row="0" Grid.Column="1"Orientation="Vertical"  Minimum="-180" Maximum="180" LargeChange="10" SmallChange="1" Value="0" /><ScrollBar Name="hscroll" Grid.Row="1" Grid.Column="0"Orientation="Horizontal" Minimum="-180" Maximum="180" LargeChange="10" SmallChange="1" Value="0" /><Viewport3D Margin="4,4,4,4" Grid.Row="0" Grid.Column="0"><ModelVisual3D><ModelVisual3D.Content><Model3DGroup><!-- Lights --><AmbientLight Color="Gray" /><DirectionalLight Color="Gray" Direction="1,-2,-3" /><DirectionalLight Color="Gray" Direction="-1,2,3" /><GeometryModel3D><GeometryModel3D.Geometry><!-- Cube --><MeshGeometry3D Positions="-1,-1,-1   1,-1,-1   1,-1, 1  -1,-1, 1-1,-1, 1   1,-1, 1   1, 1, 1  -1, 1, 11,-1, 1   1,-1,-1   1, 1,-1   1, 1, 11, 1, 1   1, 1,-1  -1, 1,-1  -1, 1, 1-1,-1, 1  -1, 1, 1  -1, 1,-1  -1,-1,-1 -1,-1,-1  -1, 1,-1   1, 1,-1   1,-1,-1"TriangleIndices="0  1  2     2  3  04  5  6     6  7  48  9 10    10 11  812 13 14    14 15 1216 17 18    18 19 1620 21 22    22 23 20" /></GeometryModel3D.Geometry><GeometryModel3D.Material><DiffuseMaterial Brush="Blue" /></GeometryModel3D.Material></GeometryModel3D></Model3DGroup></ModelVisual3D.Content></ModelVisual3D><Viewport3D.Camera><PerspectiveCamera Position = "1.5, 2, 3"LookDirection = "-1.5, -2, -3"UpDirection = "0, 1, 0"FieldOfView = "60"><PerspectiveCamera.Transform><Transform3DGroup><RotateTransform3D><RotateTransform3D.Rotation><AxisAngleRotation3DAxis="0 1 0" Angle="{Binding ElementName=hscroll, Path=Value}" /></RotateTransform3D.Rotation></RotateTransform3D><RotateTransform3D><RotateTransform3D.Rotation><AxisAngleRotation3DAxis="1 0 0" Angle="{Binding ElementName=vscroll, Path=Value}" /></RotateTransform3D.Rotation></RotateTransform3D></Transform3DGroup></PerspectiveCamera.Transform></PerspectiveCamera></Viewport3D.Camera></Viewport3D></Grid>
</Window>


http://www.ppmy.cn/ops/141586.html

相关文章

Netty 的 SSL/TLS 安全通信

SSL/TLS&#xff08;Secure Sockets Layer/Transport Layer Security&#xff09;协议是网络通信中常用的加密协议&#xff0c;用于确保客户端和服务器之间数据的安全性与完整性。SSL/TLS 通过对数据进行加密和身份验证&#xff0c;可以防止数据泄露和篡改。 在基于 Netty 的应…

【jvm】内存溢出内存不够的原因

目录 1. 内存分配与回收问题2. 代码逻辑问题3. JVM参数设置不当4. 系统资源限制 1. 内存分配与回收问题 1.堆内存不足&#xff1a;应用程序申请的内存超过了JVM堆内存的限制&#xff0c;导致内存溢出。代码中可能存在内存泄漏&#xff0c;即对象在不再需要时仍被引用&#xff…

【强化学习】表格型方法 李宏毅 蘑菇书 第三章

本文主要针对查找表的强化学习方法&#xff08;表格型方法&#xff09;&#xff0c;讨论表格型方法是什么&#xff0c;他的常见类型和使用的场景&#xff0c;常见的算法&#xff0c;这三个类型给具有一定基础知识的读者介绍表格方法。 主要参考李宏毅的蘑菇书&#xff0c;在线…

selenium获取请求头

【原创】Selenium获取请求头、响应头-腾讯云开发者社区-腾讯云 selenium 4.0.0 selenium-wire 5.1.0 python 3.10 from seleniumwire import webdriver import time from selenium.webdriver.common.by import By import re def get_request_headers(driver):"""…

前端(五)css属性

css属性 文章目录 css属性一、字体属性二、文本属性三、背景属性四、盒子模型 一、字体属性 font-weight&#xff1a;文字粗细&#xff0c;在100到900之间&#xff0c;normal(400),bord(700),inherit(继承父类) font-style&#xff1a;文字风格&#xff0c;normal表示正常(默认…

RUST学习笔记

文章目录 安装与简介[参考RUST官网安装](https://www.rust-lang.org/zh-CN/tools/install)代码学习[参考RUST官网](https://doc.rust-lang.org/book/ch00-00-introduction.html)关键字数据类型数值类型变量整型arch类型浮点类型布尔类型复合数据类型 安装与简介参考RUST官网安装…

《C++赋能自然语言处理:词向量模型的构建与应用》

在人工智能的璀璨星空中&#xff0c;自然语言处理&#xff08;NLP&#xff09;无疑是一颗耀眼的明星。它致力于让计算机理解、分析和生成人类语言&#xff0c;从而实现人机之间更加自然流畅的交互。而词向量模型作为自然语言处理的重要基石&#xff0c;能够将单词映射到低维向量…

React框架:解锁现代化Web开发的新维度

在当今前端开发领域&#xff0c;React 无疑是一颗璀璨的明星。React 是由 Facebook 开发的用于构建用户界面的 JavaScript 库&#xff0c;它在前端开发中占据着重要的地位&#xff0c;为开发者提供了一种高效、灵活且可维护的方式来构建复杂的用户界面。 一、React 的背景与开…