0

我想渲染一个贴有纹理的立方体。这是我的纹理:

在此处输入图像描述

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

这是我的 Viewport3D:

<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>

结果:

在此处输入图像描述

首先,我想尝试只获得正面。我只显示了第一个矩形。不幸的是,我无法选择另一个矩形,它也被镜像了。

4

1 回答 1

2

在这篇文章中

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

查尔斯·佩佐德 说

我的“Windows 3D 编程”一书第 5 章的一个很好的部分解决了以合理的方式用位图图像覆盖立方体(和方形长方体)的问题。

通常,一个好的开始方法是(在一张纸上)绘制一个代表您的图像的矩形,然后决定该图像的哪个部分应该放置在立方体的哪个部分上。由于 Positions 集合中的每个点都映射到 TextureCoordinates 集合中的一个点,因此您可能会发现您尝试做的事情在拓扑上是不可能的。

但是,如果所有其他方法都失败了,您总是可以将立方体视为 6 个独立的正方形,并且每个正方形独立于其他正方形。

我接受了他的“蛮力”建议,并使用您的位图修改了他在第 5 章中的一个示例。结果如下所示:

结果

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

<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>
于 2021-12-25T01:24:23.203 回答