Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Trider

Frischling

  • »Trider« ist der Autor dieses Themas

Beiträge: 1

Beruf: angestellter / programmierer

  • Private Nachricht senden

1

28.11.2006, 10:40

Problem bei synchroner kamera und Mesh bewegung bei D3D c#

Hallo alle zusammen,

ich habe erst vor kurzem mit DirectX angefangen zu programmieren, da ich es für meinen Beruf brauche. Zur zeit bin ich an einem Grundgerüst für ein Programm und mir fehlt einfach etwas knowhow welches ich auch im internet nicht gefunden oder falsch gesucht habe :)

Ich hab mehrere meshes in meinem Raum um die ich mich drehe. das funktioniert einwandfrei. Desweiteren habe ich ein Koordinatensystem eingebaut, welches sich auch mitdreht. Hierzu wolltte ich nun in 3D Text die koordinatenbezeichnungen einfügen. Das problem hierbei ist aber das man den Text nicht mehr lesen kann wenn angefangen wird sich um die meshes zu drehn.

Wie kann ich das realisieren, das ich mich weiterhin um die meshes drehen kann aber meine 3D Texte auf der stelle bleiben und sich dem dementsprechenden Winkel anpassen?

Hier mal der Quellcode damit ihr seht wie ich alles initialisiere....

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
/*initialisierung der Kamera*/
dev.Transform.Projection =
                Matrix.PerspectiveFovLH(Geometry.DegreeToRadian(90.0f),
                (float)this.ClientSize.Width / this.ClientSize.Height,
                0.1f, 10000.0f);

/*rendern der drehung der Kamera*/
device.Transform.World =
                Matrix.RotationYawPitchRoll(Geometry.DegreeToRadian(distX),
                Geometry.DegreeToRadian(distY), 0.0f) *
                Matrix.Translation(new Vector3(0, 0, camDistance));

/*mein 3D Text*/
mesh3DText = Mesh.TextFromFont(
                    dev, 
                    new System.Drawing.Font("Arial", 15),
                    "Hello World",
                    0.001f,
                    0.4f);

/*spezielle anpassungen des textes*/
VertexFormats format_vf = VertexFormats.PositionNormal | VertexFormats.Diffuse;

            Mesh new3DText = mesh3DText.Clone(MeshFlags.Managed, format_vf, device);

            CustomVertex.PositionNormalColored[] data_3D_Text = (CustomVertex.PositionNormalColored[])new3DText.VertexBuffer.Lock(0, typeof(CustomVertex.PositionNormalColored), LockFlags.None, new3DText.NumberVertices);

            for (int i = 0; i < data_3D_Text.Length; i++)
            {
                data_3D_Text[i].Color = Color.Black.ToArgb();

                data_3D_Text[i].X += meshLocations[0].X + Cylinder_length + 1f;
                data_3D_Text[i].Y += meshLocations[0].Y;
                data_3D_Text[i].Z += meshLocations[0].Z;
            }

            new3DText.VertexBuffer.Unlock();

            mesh3DText = new3DText;

/*Rendern des textes*/
mesh3DText.DrawSubset(0);

/*die komplette rendermethode*/
public void Render()
        {
            Material material = new Material();

            device.BeginScene();
            //==========================================================================//
            //          render something

            for (int i = 0; i < meshes_to_sign; i++)
            {

                if (activeMesh == mesharray[i])
                    device.RenderState.FillMode = FillMode.WireFrame;
                else
                    device.RenderState.FillMode = FillMode.Solid;

                mesharray[i].DrawSubset(0);
                loecher[i].DrawSubset(0);
            }

            device.VertexFormat = Vertex.FVF_Flags;
            device.SetStreamSource(0, vertexBuffer, 0);
            device.DrawPrimitives(PrimitiveType.LineList, 0, 3);

/*2D Text*/
//            Bez_Achse_x.DrawText(null, "Hello World", 100, 10, Color.Red);

/*3D Text*/
            mesh3DText.DrawSubset(0);

            device.Transform.World =
                Matrix.RotationYawPitchRoll(Geometry.DegreeToRadian(distX),
                Geometry.DegreeToRadian(distY), 0.0f) *
                Matrix.Translation(new Vector3(0, 0, camDistance));

            //device.Transform.World = device.Transform.World * m3DText;
            

            //=========================================================================//
            device.EndScene();
            device.Present();
        }


Es ist egal ob ich mesh3DText.DrawSubset(0); vor oder nach der transformation hinschreibe, es dreht sich einfach nicht. Hat jemand eine Ahnung warum?

Bin über jeden tipp sehr dankbar, ich finde absolut gar nix dazu im internet, oder bin zu dumm es zu kombinieren :)

Gruss Trider

TrommlBomml

Community-Fossil

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

2

16.08.2007, 14:32

In directx ist die lösung des Problems Billboading. Bei dreht sich dein 3d-text einfach entegengesetzt zu deiner Kameradrehung. eigentlich macht man das bei einfachen Quads, aba bei 3d-text geht das natürlich genauso :p