如何为Mesh3D

时间:2018-03-31 22:18:42

标签: c# wpf directx texture-mapping sharpdx

我是3D编程的新手,我很难让我的纹理正确填充我的网格。我已经在墙壁上正确选择了尺寸,但是屋顶上的纹理以一定的角度运行并且伸展得太远了。

我有几种创建网格物体的方法,但它们最终都被发送到AddTriangle方法,其中设置了TextureCoordinates。

public static void AddTriangle(this MeshGeometry3D mesh, Point3D[] pts)
{
    // Create the points.
    int index = mesh.Positions.Count;
    foreach (Point3D pt in pts)
    {
        mesh.Positions.Add(pt);
        mesh.TriangleIndices.Add(index++);
        mesh.TextureCoordinates.Add(new Point(pt.X + pt.Z, 0 - pt.Y));
    }
}

以下是我的资料设置方式。

imageBrush.ImageSource = new BitmapImage(new Uri("pack://application:,,,/Textures/shingles1.jpg"));
imageBrush.TileMode = TileMode.Tile;
imageBrush.ViewportUnits = BrushMappingMode.Absolute;
imageBrush.Viewport = new Rect(0, 0, 25, 25);
SidingColor = new DiffuseMaterial(imageBrush);
SidingColor.Color = RGB(89, 94, 100);

我的纹理看起来像这样:

shingle1.jpg

这是我得到的结果。

Texture Problem.jpg

在我玩弄数小时和谷歌搜索之后,这就像我能得到的那样接近。

1 个答案:

答案 0 :(得分:0)

这比我预想的要困难一些。

以下是帮助我找到解决方案的资源。

How to convert a 3D point on a plane to UV coordinates?

从下面的链接中我意识到上面的公式是正确的,但对于右手坐标系。我转换了它,这是最后一步。

http://www.math.tau.ac.il/~dcor/Graphics/cg-slides/geom3d.pdf

以下是其他人有此问题的代码。

public static void main(String[] args) {
    int exitFlag = 0;
    int choice = showMenu();

     do {
            switch (choice) {
            case 1:
                System.out.println("pythagoraen()");
                break;
            case 2:
                System.out.println("subtraction()");
                break;
            case 3:
                System.out.println("multiplication()");
                break;
            case 4:
                System.out.println("division()");
                break;
            case 5:
                System.out.println("exitprogam()");
                exitFlag = 1; 
                break;
            default: 
                System.out.println("Invalid Option()");

                break;
            }
        if (exitFlag != 1) {
            choice = showMenu();    
        }

      }while (choice != 5);
}

private static int showMenu() {
    System.out.println("Hello, This is the math program");
    System.out.println("Select an application from below: \n");
    System.out.println("(1) pythagoraen");
    System.out.println("(2) Subtraction");
    System.out.println("(3) Multiplication");
    System.out.println("(4) Division");
    System.out.println("(5) Exit");
    System.out.println("What is your Choice? ");

    Scanner input = new Scanner(System.in);
    int choice = input.nextInt();
    return choice;
}