[C#]2次元の妻のための3Dギャラリーを作成します

要約

プロジェクトの住所:二次元の妻のギャラリー

次に、ギャラリーを作りたいので、立方体を使う必要はなく、「壁」を作るだけです。
実際には、1つの平面上に別の長方形の平面を作成するのは非常に簡単です。2つのポイントと壁の角の高さを入力するだけで済みます。これは、立方体を書いた人にとっては間違いなく非常に簡単です。4つ以下です。 2つの三角形に分割

private MeshGeometry3D MakeSurface(Point3D p0, Point3D p1, Point3D p2, Point3D p3)
{
    
    
    MeshGeometry3D mesh = new MeshGeometry3D();
    Point3D[] pts ={
    
    p0, p1, p2, p3};
    foreach (var pt in pts)
        mesh.Positions.Add(pt);
    foreach (var i in new int[6] {
    
     0, 1, 2, 2, 3, 0 })
        mesh.TriangleIndices.Add(i);

    return mesh;
}

次に、立方体を作成する前と同じように平らな地面を作成してから、いくつかの立方体を地面に配置します。

地面の正方形は地面に対して垂直である必要があるため、過負荷にします

private MeshGeometry3D MakeSurface(Point p0, Point p1, double high)
{
    
    
    return MakeSurface(![在这里插入图片描述](https://img-blog.csdnimg.cn/fa28c5a71a834d3189165dd794060382.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5b6u5bCP5Ya3,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)

        new Point3D(p0.X, 0, p0.Y), 
        new Point3D(p1.X, 0, p1.Y), 
        new Point3D(p1.X, high, p1.Y), 
        new Point3D(p0.X, high, p0.Y));
}

次に、モデルを生成します

ここに画像の説明を挿入

コードは

private void DefineModel(Model3DGroup group)
{
    
    
    // Make the ground.
    const double wid = 10;
    MeshGeometry3D groundMesh = MakeSurface(
        new Point3D(-wid, 0, -wid),
        new Point3D(-wid, 0, +wid),
        new Point3D(+wid, 0, +wid),
        new Point3D(+wid, 0, -wid));
    DiffuseMaterial groundMaterial = new DiffuseMaterial(Brushes.DarkGray);
    GeometryModel3D groundModel = new GeometryModel3D(groundMesh, groundMaterial);
    group.Children.Add(groundModel);

    MaterialGroup gpMaterial;

    for (int x = -2; x <= 2; x += 2)
    {
    
    
        for (int y = -2; y <= 2; y += 2)
        {
    
    
            MeshGeometry3D mesh = MakeSurface(new Point(x, y), new Point(x, y + 1), 1);
            byte r = (byte)(128 + x * 50);
            byte g = (byte)(128 + y * 50);
            byte b = (byte)(128 + x * 50);
            Color color = Color.FromArgb(255, r, g, b);
            DiffuseMaterial material = new DiffuseMaterial(
                new SolidColorBrush(color));

            GeometryModel3D model = new GeometryModel3D(mesh, material);
            group.Children.Add(model);
        }
    }
}

次のステップはテクスチャをマウントすることです。結果はおおよそ次のようになります。

ここに画像の説明を挿入

この方法も非常に簡単です。つまりmaterial、目的の画像に変換するため、最初に画像を文字列配列に配置します。

static readonly string[] imgs = new string[9]
{
    
    
    "2d1.png","2d2.png","2d3.png","2d4.png","2d5.png",
    "2d6.png","2d7.png","2d8.png","2d9.png"
};

次に、画像自体に座標系が必要なため、壁のコードを次のように変更する必要があることに注意してください。

private MeshGeometry3D MakeSurface(Point p0, Point p1, double high, string uri = null)
{
    
    
    var mesh = MakeSurface(
        new Point3D(p0.X, 0, p0.Y), new Point3D(p1.X, 0, p1.Y), 
        new Point3D(p1.X, high, p1.Y), new Point3D(p0.X, high, p0.Y));
    //这四个点代表图像上的坐标和图形中点的对应关系
    Point[] textureCoods = new Point[4]
    {
    
    
        new Point(0, 1),new Point(1, 1),
        new Point(1, 0),new Point(0, 0),
    };
    foreach (var pt  in textureCoods)
        mesh.TextureCoordinates.Add(pt);
    return mesh;
}

次に、正方形を生成するときに、色を画像に置き換えます

ImageBrush imgBrush = new ImageBrush();
imgBrush.ImageSource = new BitmapImage(new Uri(
    $"imgs//{
      
      imgs[k++]}", UriKind.Relative));

MeshGeometry3D mesh = MakeSurface(new Point(x, y), new Point(x, y + 1), 1);

GeometryModel3D model = new GeometryModel3D(mesh, new DiffuseMaterial(imgBrush));
group.Children.Add(model);

このように、二次元の姉妹紙が壁に使われます。

もちろん、想像力があれば、迷路のように壁をつなぐことができ、没入型の体験は間違いなくあります。

おすすめ

転載: blog.csdn.net/m0_37816922/article/details/124235174