WPF 3D Cube及点击交互

2021-01-25 00:16

阅读:555

标签:tool   edit   etc   tran   mod   摄像机   bounds   处理   工程   

       在WPF中构建一个简单的立方体比较容易实现,可参考资料也比较众多。比较麻烦的是处理点击交互。

       我在WPF中用两种方式实现了3DCube,效果图如下:

技术图片

技术图片

 

方式一: 最常见的3D内容构建模式,结构如下图。

技术图片

参考

 "True" ClipToBounds="True"
                    RenderTransformOrigin="0.5 0.5" RenderOptions.EdgeMode="Aliased" 
                    RenderOptions.CachingHint="Cache">
            
            "CameraMain" Position="4,4,6" UpDirection="0,1,0" LookDirection="-4,-4,-6" 
                                       NearPlaneDistance="1" FarPlaneDistance="100" FieldOfView="120">
                    "CameraRotate" Axis="0,1,0" Angle="0"/>
                                "White">
                        "White"  Direction="4,6,-6"/>
                    "CubeSlaveContainer">
                "TopPanel">
                        "MaterialTop">
                                "1" Foreground="White"/>
                                        "Transparent"/>
                        "-2,2,2  2,2,2  2,2,-2  -2,2,-2"   
                                            TriangleIndices="0,1,2 0,2,3" 
                                            TextureCoordinates="-2,2 2,2 2,-2 -2,-2">
                            "BottomPanel">
                        "MaterialBottom">
                                "2" Foreground="White"/>
                                        "Transparent"/>
                        "-2,-2,2  2,-2,2  2,-2,-2  -2,-2,-2"   
                                            TriangleIndices="0,2,1 0,3,2" 
                                            TextureCoordinates="-2,2 2,2 2,-2 -2,-2">
                            "LeftPanel">
                        "MaterialLeft">
                                "3" Foreground="White"/>
                                        "Transparent"/>
                        "-2,-2,-2  -2,-2,2  -2,2,2  -2,2,-2"   
                                            TriangleIndices="0,1,2 0,2,3"
                                            TextureCoordinates="-2,2 2,2 2,-2 -2,-2">
                            "RightPanel">
                        "MaterialRight">
                                "4" Foreground="White"/>
                                        "Transparent"/>
                        "2,-2,2  2,-2,-2  2,2,-2  2,2,2"   
                                            TriangleIndices="0,1,2 0,2,3" 
                                            TextureCoordinates="-2,2 2,2 2,-2 -2,-2">
                            "FrontPanel">
                        "MaterialFront">
                                "5" Foreground="White"/>
                                        "Transparent"/>
                        "-2,-2,2  2,-2,2  2,2,2  -2,2,2" 
                                            TriangleIndices="0,1,2 0,2,3" 
                                            TextureCoordinates="-2,2 2,2 2,-2 -2,-2">
                            "BackPanel">
                        "MaterialBack">
                                "6" Foreground="White">"Transparent"/>
                        "2,-2,-2  -2,-2,-2  -2,2,-2  2,2,-2"   
                                            TriangleIndices="0,1,2 0,2,3" 
                                            TextureCoordinates="-2,2 2,2 2,-2 -2,-2">
                            

点击交互:

     给ModelUIElement3D附加事件,如下图

技术图片

 

方式二: 使用3DTools.dll构建,结构如下图

技术图片

参考

        
        "Stretch"
                                         VerticalAlignment="Stretch">
            "Viewport3DMain" Margin="0,-50,0,50" 
                        SnapsToDevicePixels="True"  ClipToBounds="True"
                        RenderTransformOrigin="0.5 0.5" RenderOptions.EdgeMode="Aliased" 
                        RenderOptions.CachingHint="Cache">
                
                "CameraMain" Position="4,4,6" 
                                   UpDirection="0,1,0" LookDirection="-4,-4,-6" 
                                   NearPlaneDistance="1" FarPlaneDistance="100" FieldOfView="120">
                        "CameraRotate" Axis="0,1,0" Angle="0"/>
                                    "White">
                            "White"  Direction="4,6,-6"/>
                        "TopPanel" IsBackVisible="True">
                        "-2,2,2  2,2,2  2,2,-2  -2,2,-2"   
                                           TriangleIndices="0,1,2 0,2,3" 
                                           TextureCoordinates="0,0 0,1 1,1 1,0"
                                            Normals="0,1,0 0,1,0 0,1,0 0,1,0"/>
                        "BottomPanel" IsBackVisible="True">
                        "-2,-2,2  2,-2,2  2,-2,-2  -2,-2,-2"   
                                            TriangleIndices="0,2,1 0,3,2" 
                                            TextureCoordinates="0,0 0,1 1,1 1,0"
                                            Normals="0,1,0 0,1,0 0,1,0 0,1,0"/>
                        "LeftPanel" IsBackVisible="True">
                        "-2,-2,-2  -2,-2,2  -2,2,2  -2,2,-2"   
                                            TriangleIndices="0,1,2 0,2,3"
                                            TextureCoordinates="0,0 0,1 1,1 1,0"
                                            Normals="0,1,0 0,1,0 0,1,0 0,1,0"/>
                        "RightPanel" IsBackVisible="True">
                        "2,-2,2  2,-2,-2  2,2,-2  2,2,2"   
                                            TriangleIndices="0,1,2 0,2,3" 
                                            TextureCoordinates="0,0 0,1 1,1 1,0"
                                            Normals="0,1,0 0,1,0 0,1,0 0,1,0"/>
                        "FrontPanel" IsBackVisible="True">
                        "-2,-2,2  2,-2,2  2,2,2  -2,2,2" 
                                            TriangleIndices="0,1,2 0,2,3" 
                                            TextureCoordinates="0,0 0,1 1,1 1,0"
                                            Normals="0,1,0 0,1,0 0,1,0 0,1,0"/>
                        "BackPanel" IsBackVisible="True">
                    "2,-2,-2  -2,-2,-2  -2,2,-2  2,2,-2"   
                                            TriangleIndices="0,1,2 0,2,3" 
                                            TextureCoordinates="0,0 0,1 1,1 1,0"
                                            Normals="0,1,0 0,1,0 0,1,0 0,1,0"/>
                    

 

点击交互:

       给Plugin3D:InteractiveVisual3D对象的Visual对象附加点击事件,如创建一个Grid, 将Grid作为Plugin3D:InteractiveVisual3D的Visual值。

调用: this.SetCubeMaterialBrush(this.FrontPanel, "定义的ImageBrush资源的Key值", 5);

          技术图片?

    工具:Visual Studio 2017

    工程:WPF C#

    源码下载:

             技术图片

WPF 3D Cube及点击交互

标签:tool   edit   etc   tran   mod   摄像机   bounds   处理   工程   

原文地址:https://www.cnblogs.com/duel/p/3dcube.html


评论


亲,登录后才可以留言!