WPF Viewport3D Model3DGroup GeometryModel3D ModelVisual3D PerspectiveCamera DirectionalLight MeshGeometry3D
Vector3DCollection Point3DCollection PointCollection Int32Collection LinearGradientBrush DiffuseMaterial
RotateTransform3D AxisAngleRotation3D
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Media.Media3D; using System.Windows.Navigation; using System.Windows.Shapes; namespace WpfApp103 { /// <summary> /// Interaction logic for MainWindow.xaml /// </summary> public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); WindowState = System.Windows.WindowState.Maximized; WindowStyle = System.Windows.WindowStyle.None; InitViewPort3D(); } private void InitViewPort3D() { Viewport3D myViewport3D = new Viewport3D(); Model3DGroup myModel3DGroup = new Model3DGroup(); GeometryModel3D myGeometryModel = new GeometryModel3D(); ModelVisual3D myModelVisual3D = new ModelVisual3D(); // Defines the camera used to view the 3D object. In order to view the 3D object, // the camera must be positioned and pointed such that the object is within view // of the camera. PerspectiveCamera myPCamera = new PerspectiveCamera(); // Specify where in the 3D scene the camera is. myPCamera.Position = new Point3D(0, 0, 2); // Specify the direction that the camera is pointing. myPCamera.LookDirection = new Vector3D(0, 0, -1); // Define camera's horizontal field of view in degrees. myPCamera.FieldOfView = 60; // Asign the camera to the viewport myViewport3D.Camera = myPCamera; // Define the lights cast in the scene. Without light, the 3D object cannot // be seen. Note: to illuminate an object from additional directions, create // additional lights. DirectionalLight myDirectionalLight = new DirectionalLight(); myDirectionalLight.Color = Colors.White; myDirectionalLight.Direction = new Vector3D(-0.61, -0.5, -0.61); myModel3DGroup.Children.Add(myDirectionalLight); // The geometry specifes the shape of the 3D plane. In this sample, a flat sheet // is created. MeshGeometry3D myMeshGeometry3D = new MeshGeometry3D(); // Create a collection of normal vectors for the MeshGeometry3D. Vector3DCollection myNormalCollection = new Vector3DCollection(); myNormalCollection.Add(new Vector3D(0, 0, 1)); myNormalCollection.Add(new Vector3D(0, 0, 1)); myNormalCollection.Add(new Vector3D(0, 0, 1)); myNormalCollection.Add(new Vector3D(0, 0, 1)); myNormalCollection.Add(new Vector3D(0, 0, 1)); myNormalCollection.Add(new Vector3D(0, 0, 1)); myMeshGeometry3D.Normals = myNormalCollection; // Create a collection of vertex positions for the MeshGeometry3D. Point3DCollection myPositionCollection = new Point3DCollection(); myPositionCollection.Add(new Point3D(-0.5, -0.5, 0.5)); myPositionCollection.Add(new Point3D(0.5, -0.5, 0.5)); myPositionCollection.Add(new Point3D(0.5, 0.5, 0.5)); myPositionCollection.Add(new Point3D(0.5, 0.5, 0.5)); myPositionCollection.Add(new Point3D(-0.5, 0.5, 0.5)); myPositionCollection.Add(new Point3D(-0.5, -0.5, 0.5)); myMeshGeometry3D.Positions = myPositionCollection; // Create a collection of texture coordinates for the MeshGeometry3D. PointCollection myTextureCoordinatesCollection = new PointCollection(); myTextureCoordinatesCollection.Add(new Point(0, 0)); myTextureCoordinatesCollection.Add(new Point(1, 0)); myTextureCoordinatesCollection.Add(new Point(1, 1)); myTextureCoordinatesCollection.Add(new Point(1, 1)); myTextureCoordinatesCollection.Add(new Point(0, 1)); myTextureCoordinatesCollection.Add(new Point(0, 0)); myMeshGeometry3D.TextureCoordinates = myTextureCoordinatesCollection; // Create a collection of triangle indices for the MeshGeometry3D. Int32Collection myTriangleIndicesCollection = new Int32Collection(); myTriangleIndicesCollection.Add(0); myTriangleIndicesCollection.Add(1); myTriangleIndicesCollection.Add(2); myTriangleIndicesCollection.Add(3); myTriangleIndicesCollection.Add(4); myTriangleIndicesCollection.Add(5); myMeshGeometry3D.TriangleIndices = myTriangleIndicesCollection; // Apply the mesh to the geometry model. myGeometryModel.Geometry = myMeshGeometry3D; // The material specifies the material applied to the 3D object. In this sample a // linear gradient covers the surface of the 3D object. // Create a horizontal linear gradient with four stops. LinearGradientBrush myHorizontalGradient = new LinearGradientBrush(); myHorizontalGradient.StartPoint = new Point(0, 0.5); myHorizontalGradient.EndPoint = new Point(1, 0.5); myHorizontalGradient.GradientStops.Add(new GradientStop(Colors.Yellow, 0.0)); myHorizontalGradient.GradientStops.Add(new GradientStop(Colors.Red, 0.25)); myHorizontalGradient.GradientStops.Add(new GradientStop(Colors.Blue, 0.75)); myHorizontalGradient.GradientStops.Add(new GradientStop(Colors.LimeGreen, 1.0)); // Define material and apply to the mesh geometries. DiffuseMaterial myMaterial = new DiffuseMaterial(myHorizontalGradient); myGeometryModel.Material = myMaterial; // Apply a transform to the object. In this sample, a rotation transform is applied, // rendering the 3D object rotated. RotateTransform3D myRotateTransform3D = new RotateTransform3D(); AxisAngleRotation3D myAxisAngleRotation3d = new AxisAngleRotation3D(); myAxisAngleRotation3d.Axis = new Vector3D(0, 3, 0); myAxisAngleRotation3d.Angle = 40; myRotateTransform3D.Rotation = myAxisAngleRotation3d; myGeometryModel.Transform = myRotateTransform3D; // Add the geometry model to the model group. myModel3DGroup.Children.Add(myGeometryModel); // Add the group of models to the ModelVisual3d. myModelVisual3D.Content = myModel3DGroup; // myViewport3D.Children.Add(myModelVisual3D); // Apply the viewport to the page so it will be rendered. this.Content = myViewport3D; } } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
2021-12-28 C++ read and log linux command in physical file
2021-12-28 C++ timer execute function in interval time span
2021-12-28 C++ invoke other class function
2021-12-28 C++ vector generated via rand() and print with fixed width
2016-12-28 My time is limited
2016-12-28 WPF toolkit AutoCompleteBox