WPF Visual3D MeshGeometry3D Positions TriangleIndices TextureCoordinates

复制代码
//xaml
<Window x:Class="WpfApp112.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp112"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <Viewport3D Panel.ZIndex="0">
            <Viewport3D.Camera>
                <PerspectiveCamera Position="3,3,4"
                                   LookDirection="-1,-1,-1"
                                   FieldOfView="60"/>
            </Viewport3D.Camera>
            <Viewport3D.Children>
                <ModelVisual3D>
                    <ModelVisual3D.Content>
                        <DirectionalLight Direction="-0.3,-0.4,-0.5"/>
                    </ModelVisual3D.Content>
                </ModelVisual3D>
                <ModelVisual3D x:Name="container">
                    <Viewport2DVisual3D>
                        <Viewport2DVisual3D.Transform>
                            <Transform3DGroup>
                                <TranslateTransform3D OffsetX="1.5"/>
                                <RotateTransform3D>
                                    <RotateTransform3D.Rotation>
                                        <AxisAngleRotation3D x:Name="rotationY"
                                                             Axis="0,1,0"
                                                             Angle="0"/>
                                    </RotateTransform3D.Rotation>
                                </RotateTransform3D>
                            </Transform3DGroup>
                        </Viewport2DVisual3D.Transform>
                        <Viewport2DVisual3D.Geometry>
                            <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,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,1,-1 1,1,1 1,1,-1 -1,1,-1
-1,1,1"
                                            TriangleIndices="0 1 2 0 2 3 4 5 6 4 6 7 8 9 10 8 10 11 12 13 14 12
14 15 16 17 18 16 18 19 20 21 22 20 22 23"
                                            TextureCoordinates="0,1 0,0 1,0 1,1 1,1 -0,1 0,-0 1,0 1,1 -0,1 0,-0
1,0 1,0 1,1 -0,1 0,-0 -0,0 1,-0 1,1 0,1 1,-0 1,1
0,1 -0,0"/>
                        </Viewport2DVisual3D.Geometry>
                        <Viewport2DVisual3D.Material>
                            <DiffuseMaterial Viewport2DVisual3D.IsVisualHostMaterial="True"/>
                        </Viewport2DVisual3D.Material>
                        <Button Name="testButton">
                            <Button.RenderTransform>
                                <ScaleTransform ScaleY="-1"/>
                            </Button.RenderTransform>
                            Hello,3D
                        </Button>
                    </Viewport2DVisual3D>
                </ModelVisual3D>
                <ModelUIElement3D>
                    <ModelUIElement3D.Transform>
                        <Transform3DGroup>
                            <ScaleTransform3D ScaleX="0.2"
                                              ScaleY="0.2"
                                              ScaleZ="0.2"/>
                            <TranslateTransform3D x:Name="cube_translation"/>
                        </Transform3DGroup>
                    </ModelUIElement3D.Transform>
                    <ModelUIElement3D.Model>
                        <GeometryModel3D>
                            <GeometryModel3D.Material>
                                <DiffuseMaterial>
                                    <DiffuseMaterial.Brush>
                                        <SolidColorBrush Color="Purple"/>
                                    </DiffuseMaterial.Brush>
                                </DiffuseMaterial>
                            </GeometryModel3D.Material>
                            <GeometryModel3D.Geometry>
                                <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,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,1,-1 1,1,1 1,1,-1
-1,1,-1 -1,1,1"
                                                TriangleIndices="0 1 2 0 2 3 4 5 6 4 6 7 8 9 10 8 10 11 12 13 14 12
14 15 16 17 18 16 18 19 20 21 22 20 22 23"
                                                TextureCoordinates="0,1 0,0 1,0 1,1 1,1 -0,1 0,-0 1,0 1,1 -0,1 0,-0
1,0 1,0 1,1 -0,1 0,-0 -0,0 1,-0 1,1 0,1 1,-0 1,1
0,1 -0,0"/>
                            </GeometryModel3D.Geometry>
                        </GeometryModel3D>
                    </ModelUIElement3D.Model>
                </ModelUIElement3D>
            </Viewport3D.Children>
        </Viewport3D>
    </Grid>
    <Window.Triggers>
        <EventTrigger RoutedEvent="Window.Loaded">
            <BeginStoryboard>
                <Storyboard>
                    <DoubleAnimation Storyboard.TargetName="rotationY"
                                     Storyboard.TargetProperty="Angle"
                                     From="0"
                                     To="360"
                                     Duration="0:0:12"
                                     RepeatBehavior="Forever"/>
                </Storyboard>
            </BeginStoryboard>
        </EventTrigger>
    </Window.Triggers>
</Window>



//cs
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.Media3D;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace WpfApp112
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            CompositionTarget.Rendering += CompositionTarget_Rendering;
        }

        static TimeSpan lastRenderTime = new TimeSpan();
        private void CompositionTarget_Rendering(object sender, EventArgs e)
        {
            if (lastRenderTime == ((RenderingEventArgs)e).RenderingTime)
            {
                return;
            }
            lastRenderTime = ((RenderingEventArgs)e).RenderingTime;

            GeneralTransform2DTo3D transform = testButton.TransformToAncestor(container);
            Point3D pt = transform.Transform(new Point(0, 0));
            cube_translation.OffsetX = pt.X;
            cube_translation.OffsetY = pt.Y;
            cube_translation.OffsetZ = pt.Z;
        }
    }
}
复制代码

 

 

 

 

 

 

 

 

 

 

 

 

posted @   FredGrit  阅读(4)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
历史上的今天:
2022-12-29 cppconn cpp prepared statement insert into table
点击右上角即可分享
微信分享提示