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

server/2024/12/18 15:42:22/

此示例演示如何使用 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/server/151210.html

相关文章

winlogon!InitializeGlobals函数中的g_IsTerminalServer

winlogon!InitializeGlobals函数中的g_IsTerminalServer BOOL InitializeGlobals(HINSTANCE hInstance) { SID_IDENTIFIER_AUTHORITY SystemSidAuthority SECURITY_NT_AUTHORITY; ULONG SidLength; TCHAR szComputerName[MAX_COMPUTERNAME_LENGTH1]; DWORD dw…

[论文阅读]What Was Your Prompt? A Remote Keylogging Attack on AI Assistants

What Was Your Prompt? A Remote Keylogging Attack on AI Assistants http://arxiv.org/abs/2403.09751 研究背景和问题&#xff1a; &#xff08;1&#xff09; 实际应用场景和问题提出 大型语言模型 &#xff08;LLM&#xff09; 和基于聊天的 AI 服务&#xff08;如 C…

一个免费好用的魔法

前不久发表了一个可以永久免费魔法才发表十几天就有1W人浏览&#xff0c;下载的人也有几百&#xff0c;但是老是被审核员针对被封了几天号&#xff0c;现在是发不出来的了 若是想要免费永久加速器的加联系方式&#xff0c;&#xff08;需要支付俩块来支持一下&#xff0c;感谢支…

游戏关卡分析:荒野大镖客2雪山终战

1、相关剧情 主角约翰一家在农场过着悠闲的日子&#xff0c;突然平静被打破&#xff0c; 女枪手来报信&#xff0c;在某小镇找到了迈卡的消息。 于是激发了约翰的满腔怒气&#xff0c;不顾妻子的反对&#xff0c;坚决要出战&#xff0c; 要彻底歼灭迈卡&#xff0c;为亚瑟…

java服务器中,如何判定是该使用单例系统,还是微服务架构,多库分布式,服务分布式,前端分布式

在设计Java服务器架构时&#xff0c;选择单例系统、微服务架构、多库分布式、服务分布式还是前端分布式&#xff0c;需要根据具体的业务需求、技术栈、团队规模和项目复杂度等因素进行综合考虑。以下是各个架构模式的适用场景和优缺点分析&#xff0c;帮助你做出决策。 1. 单例…

学习Ajax (概述,应用场景,使用jQury 实现ajax)

目录 前言 概述 什么是Ajax? 同步交互与异步交互的区别是什么呢&#xff1f; 应用场景 场景1 在搜索框搜索 资源 场景2 登录业务的对用户名处理 AJAX的优缺点 优点&#xff1a; 缺点&#xff1a; 使用jQury 实现ajax 使用步骤 1 引入jQury 文件 2 使用Ajax 函数…

【蓝桥杯】43699-四平方和

四平方和 题目描述 四平方和定理&#xff0c;又称为拉格朗日定理&#xff1a; 每个正整数都可以表示为至多 4 个正整数的平方和。如果把 0 包括进去&#xff0c;就正好可以表示为 4 个数的平方和。 比如&#xff1a; 502021222 712121222; 对于一个给定的正整数&#xff0c;可…

MR30分布式IO模块,为港口岸桥安全增效保驾护航

随着我国港口事业的快速发展&#xff0c;岸桥作为港口装卸作业的重要设备&#xff0c;其安全性和效率成为企业关注的焦点。 背景介绍 港口岸桥作为连接船舶与陆地的重要桥梁&#xff0c;承担着货物装卸的重任。在激烈的市场竞争中&#xff0c;提高岸桥的安全性和作业效率成为企…