首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >WPF Viewport3D TextureCoordinates

WPF Viewport3D TextureCoordinates
EN

Stack Overflow用户
提问于 2021-12-23 11:14:58
回答 1查看 74关注 0票数 0

我想渲染一个立方体的纹理映射在它上面。这是我的纹理:

不应使用文本为“空”的区域。

这是我的Viewport3D:

代码语言:javascript
运行
复制
<Viewport3D>
  <Viewport3D.Camera>
    <PerspectiveCamera FarPlaneDistance="100" LookDirection="22,-10,-10" UpDirection="0,1,0" NearPlaneDistance="1" Position="-20,15,15" FieldOfView="60"/>
  </Viewport3D.Camera>
  <Viewport3D.Children>
    <ModelVisual3D>
      <ModelVisual3D.Content>
        <DirectionalLight Color="White" Direction="-2,-3,-1"/>
      </ModelVisual3D.Content>
    </ModelVisual3D>
    <ModelVisual3D>
      <ModelVisual3D.Content>
        <DirectionalLight Color="White" Direction="2,3,1"/>
      </ModelVisual3D.Content>
    </ModelVisual3D>
    <ModelVisual3D>
      <ModelVisual3D.Content>
        <GeometryModel3D>
          <GeometryModel3D.Geometry>
            <MeshGeometry3D

               Positions="
               0,0,0   8,0,0   0,8,0   8,8,0
               0,0,0   0,0,8   0,8,0   0,8,8
               0,0,0   8,0,0   0,0,8   8,0,8
               8,0,0   8,8,8   8,0,8   8,8,0
               0,0,8   8,0,8   0,8,8   8,8,8
               0,8,0   0,8,8   8,8,0   8,8,8"

               TriangleIndices="
               0,2,1       1,2,3
               4,5,6       6,5,7                                  
               8,9,10      9,11,10                                  
               12,13,14    12,15,13
               16,17,18    19,18,17
               20,21,22    22,21,23"

               TextureCoordinates="
               0.5,0       0,0.25    0.25,0     1,0.5
               0.25,0.25   0,0.25    0.25,0     0,0  ">

            </MeshGeometry3D>
          </GeometryModel3D.Geometry>
          <GeometryModel3D.Material>
            <DiffuseMaterial>
              <DiffuseMaterial.Brush>
                <ImageBrush ImageSource="cube.png"/>
              </DiffuseMaterial.Brush>
            </DiffuseMaterial>
          </GeometryModel3D.Material>
        </GeometryModel3D>
      </ModelVisual3D.Content>
    </ModelVisual3D>
  </Viewport3D.Children>
</Viewport3D>

结果:

首先,我只想试着走到最前面。我只展示了第一个矩形。不幸的是,我无法选择另一个矩形,它也是镜像的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-12-25 01:24:23

在这个岗位上

https://social.msdn.microsoft.com/Forums/vstudio/en-US/d71dacba-167a-4249-8817-1b3995103835/correctly-texture-mapping-a-cube

查尔斯·佩佐德

我的书“3”第5章很好地解决了用位图图像覆盖立方体(和正方形长方体)的问题。通常,一种很好的开始方法是(在一张纸上)画一个代表您的图像的矩形,然后决定在立方体的哪个部分上放置该图像的哪个部分。因为位置集合中的每个点都映射到TextureCoordinates集合中的一个点,所以您可能会发现您想要做的事情在拓扑上是不可能的。但是如果所有这些都失败了,你总是可以把立方体看作6个独立的正方形,并且独立于其他的方块来处理。

我带着他的“蛮力”建议,用你的位图修改了第五章中的一个例子。结果如下:

对于每一张脸,我使用一个ViewBox来定义用于该脸的图像的部分。下面是源代码(请注意,这里有滚动条,您可以使用旋转图像并验证所有方面看起来都是正确的):

代码语言:javascript
运行
复制
<DockPanel>
    <ScrollBar Name="horz"
               DockPanel.Dock="Bottom"
               Orientation="Horizontal"
               Minimum="-180"
               Maximum="180"
               LargeChange="10"
               SmallChange="1" /> 

    <ScrollBar Name="vert"
               DockPanel.Dock="Right"
               Orientation="Vertical"
               Minimum="-180"
               Maximum="180"
               LargeChange="10"
               SmallChange="1" /> 

    <Viewport3D>
        <Viewport3D.Camera>
            <PerspectiveCamera Position="-2 2 4" LookDirection="2 -2 -4" FieldOfView="60" />
        </Viewport3D.Camera>
        <Viewport3D.Children>
            <ModelVisual3D>
                <ModelVisual3D.Content>
                    <Model3DGroup>
                        <AmbientLight Color="White" />

                        <!-- Unit cube: front -->
                        <GeometryModel3D>
                            <GeometryModel3D.Geometry>
                                <MeshGeometry3D
                                    Positions="-0.5  0.5  0.5,  0.5  0.5  0.5,
                                               -0.5 -0.5  0.5,  0.5 -0.5  0.5"
                                    TriangleIndices=" 0  2  1,  1  2  3"
                                    TextureCoordinates="0 0, 1 0, 0 1, 1 1" />
                            </GeometryModel3D.Geometry>
                            <GeometryModel3D.Material>
                                <DiffuseMaterial>
                                    <DiffuseMaterial.Brush>
                                        <ImageBrush ImageSource="cube.png" Viewbox="0.25,0.5,0.25,0.5" />
                                    </DiffuseMaterial.Brush>
                                </DiffuseMaterial>
                            </GeometryModel3D.Material>
                            <GeometryModel3D.BackMaterial>
                                <DiffuseMaterial Brush="Black"/>
                            </GeometryModel3D.BackMaterial>
                        </GeometryModel3D>

                        <!-- Unit cube: back -->
                        <GeometryModel3D>
                            <GeometryModel3D.Geometry>
                                <MeshGeometry3D
                                Positions=" 0.5  0.5 -0.5, -0.5  0.5 -0.5,
                                            0.5 -0.5 -0.5, -0.5 -0.5 -0.5"
                                TriangleIndices=" 0  2  1,  1  2  3"
                                TextureCoordinates="0 0, 1 0, 0 1, 1 1"/>
                            </GeometryModel3D.Geometry>
                            <GeometryModel3D.Material>
                                <DiffuseMaterial>
                                    <DiffuseMaterial.Brush>
                                        <ImageBrush ImageSource="cube.png" Viewbox="0.75,0.5,0.25,0.5" />
                                    </DiffuseMaterial.Brush>
                                </DiffuseMaterial>
                            </GeometryModel3D.Material>
                            <GeometryModel3D.BackMaterial>
                                <DiffuseMaterial Brush="Black"/>
                            </GeometryModel3D.BackMaterial>
                        </GeometryModel3D>

                        <!-- Unit cube: left -->
                        <GeometryModel3D>
                            <GeometryModel3D.Geometry>
                                <MeshGeometry3D
                                Positions="-0.5  0.5 -0.5, -0.5  0.5  0.5,
                                           -0.5 -0.5 -0.5, -0.5 -0.5  0.5"
                                TriangleIndices=" 0  2  1,  1  2  3"
                                TextureCoordinates="0 0, 1 0, 0 1, 1 1"/>
                            </GeometryModel3D.Geometry>
                            <GeometryModel3D.Material>
                                <DiffuseMaterial>
                                    <DiffuseMaterial.Brush>
                                        <ImageBrush ImageSource="cube.png" Viewbox="0,0.5,0.25,.5"   />
                                    </DiffuseMaterial.Brush>
                                </DiffuseMaterial>
                            </GeometryModel3D.Material>
                            <GeometryModel3D.BackMaterial>
                                <DiffuseMaterial Brush="Black"/>
                            </GeometryModel3D.BackMaterial>
                        </GeometryModel3D>

                        <!-- Unit cube: right -->
                        <GeometryModel3D>
                            <GeometryModel3D.Geometry>
                                <MeshGeometry3D
                                Positions=" 0.5  0.5  0.5,  0.5  0.5 -0.5,
                                            0.5 -0.5  0.5,  0.5 -0.5 -0.5"
                                TriangleIndices=" 0  2  1,  1  2  3"
                                TextureCoordinates="0 0, 1 0, 0 1, 1 1"/>
                            </GeometryModel3D.Geometry>
                            <GeometryModel3D.Material>
                                <DiffuseMaterial>
                                    <DiffuseMaterial.Brush>
                                        <ImageBrush ImageSource="cube.png" Viewbox="0.5,0.5,0.25,.5" />
                                    </DiffuseMaterial.Brush>
                                </DiffuseMaterial>
                            </GeometryModel3D.Material>
                            <GeometryModel3D.BackMaterial>
                                <DiffuseMaterial Brush="Black"/>
                            </GeometryModel3D.BackMaterial>
                        </GeometryModel3D>

                        <!-- Unit cube: top -->
                        <GeometryModel3D>
                            <GeometryModel3D.Geometry>
                                <MeshGeometry3D
                                Positions="-0.5  0.5 -0.5,  0.5  0.5 -0.5,
                                           -0.5  0.5  0.5,  0.5  0.5  0.5"
                                TriangleIndices=" 0  2  1,  1  2  3"
                                TextureCoordinates="0 0, 1 0, 0 1, 1 1"/>
                            </GeometryModel3D.Geometry>
                            <GeometryModel3D.Material>
                                <DiffuseMaterial>
                                    <DiffuseMaterial.Brush>
                                        <ImageBrush ImageSource="cube.png" Viewbox="0.25,0.0,0.25,.5" />
                                    </DiffuseMaterial.Brush>
                                </DiffuseMaterial>
                            </GeometryModel3D.Material>
                            <GeometryModel3D.BackMaterial>
                                <DiffuseMaterial Brush="Black"/>
                            </GeometryModel3D.BackMaterial>
                        </GeometryModel3D>

                        <!-- Unit cube: bottom. -->
                        <GeometryModel3D>
                            <GeometryModel3D.Geometry>
                                <MeshGeometry3D
                                Positions=" 0.5 -0.5 -0.5, -0.5 -0.5 -0.5,
                                            0.5 -0.5  0.5, -0.5 -0.5  0.5"
                                TriangleIndices=" 0  2  1,  1  2  3"
                                TextureCoordinates="0 0, 1 0, 0 1, 1 1"/>
                            </GeometryModel3D.Geometry>
                            <GeometryModel3D.Material>
                                <DiffuseMaterial>
                                    <DiffuseMaterial.Brush>
                                        <ImageBrush ImageSource="cube.png" Viewbox="0.5,0.0,0.25,.5" />
                                    </DiffuseMaterial.Brush>
                                </DiffuseMaterial>
                            </GeometryModel3D.Material>
                            <GeometryModel3D.BackMaterial>
                                <DiffuseMaterial Brush="Black"/>
                            </GeometryModel3D.BackMaterial>
                        </GeometryModel3D>
                    </Model3DGroup>
                </ModelVisual3D.Content>
                <ModelVisual3D.Transform>
                    <Transform3DGroup>
                        <RotateTransform3D>
                            <RotateTransform3D.Rotation>
                                <AxisAngleRotation3D Axis="0 1 0" Angle="{Binding ElementName=horz, Path=Value}" />
                            </RotateTransform3D.Rotation>
                        </RotateTransform3D>
                        <RotateTransform3D>
                            <RotateTransform3D.Rotation>
                                <AxisAngleRotation3D Axis="1 0 0" Angle="{Binding ElementName=vert, Path=Value}" />
                            </RotateTransform3D.Rotation>
                        </RotateTransform3D>
                    </Transform3DGroup>
                </ModelVisual3D.Transform>
            </ModelVisual3D>
        </Viewport3D.Children>
    </Viewport3D>
</DockPanel>
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70461373

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档