Laden...

Forenbeiträge von Robertico Ingesamt 344 Beiträge

12.10.2006 - 16:44 Uhr

Vertical wird dann genau so gehen?

Gruß Robert

12.10.2006 - 10:28 Uhr

Bei gedrückter Taste und anschließendem Bewegen der Maus kommt ein KeyUp-Ereignis obwohl die Taste noch gedrückt ist.

Bleibt die Maus dann stehen, kommt das KeyDown-Ereignis. Die Taste bleibt die ganze Zeit gedrückt.

Kann man das abschalten, oder kann es durch einen Fehler von mir verursacht sein?

Gruß Robert

10.10.2006 - 17:45 Uhr

Entschuldige meine Unwissenheit.

Solchen Tips gehe ich immer nach. Da ich jetzt sowieso ein Mesh selbst zusammenstellen wollte, habe ich das auch gleich geprüft.

Sind die Vertices so, wie du gesagt hast, so ist es wie ein Guss. Man sieht nicht mehr den Übergang.

Steige immer mehr durch. 😉

Gruß Robert

09.10.2006 - 19:18 Uhr

Ich bin dort (lighting) noch nicht durchgestiegen. Um ehrlich zu gestehen habe ich mich auch noch nicht richtig damit beschäftigt.

Leider kann man nicht alles auf einmal lernen, auch wenn man es gerne möchte.

Zu gegebener Zeit werde ich euch schon damit nerven. 😉

Gruß Robert

09.10.2006 - 17:15 Uhr

neotec

Du bist wie immer Klasse. 🙂 Habe scheinbar noch viel zu lernen.

Aber eine Frage am Rande habe ich noch mit dem Licht.

Woran liegt es, dass eine Seite gleichmäßig belichtet wird und die andere nicht.

Bei mir ist das noch schlimmer.

Hier das x-File. Habe ich etwas umgebaut.


xof 0303txt 0064
Material GreenMaterial {
1.000000;1.000000;1.000000;1.000000;;	// R = 1.0, G = 0.0, B = 0.0
0.000000;
0.000000;0.000000;0.000000;;
0.000000;0.000000;0.000000;;
TextureFilename {
"Brick01.jpg";
}
}
Material RedMaterial {
1.000000;1.000000;1.000000;1.000000;; 	// R = 0.0, G = 1.0, B = 0.0
0.000000;
0.000000;0.000000;0.000000;;
0.000000;0.000000;0.000000;;
TextureFilename {
"Brick01.jpg";
}
}
Material NochnMaterial {
1.000000;1.000000;1.000000;1.000000;; 	// R = 0.0, G = 1.0, B = 0.0
0.000000;
0.000000;0.000000;0.000000;;
0.000000;0.000000;0.000000;;
TextureFilename {
"Brick01.jpg";
}
}

Mesh CubeMesh2 {
16;                                // 8 vertices.
0.100000;5.000000;-2.000000;,     // Vertex 0.
-0.100000;5.000000;-2.000000;,    // Vertex 1.
-0.100000;5.000000;1.000000;,     // And so on.
0.100000;5.000000;1.000000;,
0.100000;2.000000;-2.000000;,
-0.100000;2.000000;-2.000000;,
-0.100000;2.000000;1.000000;,
0.100000;2.000000;1.000000;,

0.100000;5.000000;-5.000000;,     // Vertex 0.
-0.100000;5.000000;-5.000000;,    // Vertex 1.
-0.100000;5.000000;-2.000000;,     // And so on.
0.100000;5.000000;-2.000000;,
0.100000;2.000000;-5.000000;,
-0.100000;2.000000;-5.000000;,
-0.100000;2.000000;-2.000000;,
0.100000;2.000000;-2.000000;;

24;                      // 12 faces.
3;0,1,2;,                // Face 0 has three vertices.
3;0,2,3;,                // And so on.
3;0,4,5;,
3;0,5,1;,
3;1,5,6;,
3;1,6,2;,
3;2,6,7;,
3;2,7,3;,
3;3,7,4;,
3;3,4,0;,
3;4,7,6;,
3;4,6,5;,

3;8,9,10;,                // Face 0 has three vertices.
3;8,10,11;,                // And so on.
3;8,12,13;,
3;8,13,9;,
3;9,13,14;,
3;9,14,10;,
3;10,14,15;,
3;10,15,11;,
3;11,15,12;,
3;11,12,8;,
3;12,15,14;,
3;12,14,13;;

// All required data has been defined. Now define optional data
// using the hierarchical nature of the file format.
MeshMaterialList {
3;                    // Number of materials used.
12;                   // A material for each face.
0,                    // Face 0 uses the first material.
0,
0,
2,
2,
0,
0,
0,
1,                    // Face 8 uses the second material.
1,
1,
1,
0,                    // Face 0 uses the first material.
0,
0,
0,
0,
0,
0,
0,
1,                    // Face 8 uses the second material.
1,
1,
1;;
{RedMaterial}         // References to the definitions
{GreenMaterial}       // of material 0 and 1.
{NochnMaterial}      // of material 0 and 1.
}
MeshTextureCoords {
16;                        // Define texture coords for each vertex.
0.000000;1.000000;
1.000000;1.000000;
0.000000;1.000000;
1.000000;1.000000;
0.000000;0.000000;
1.000000;0.000000;
0.000000;0.000000;
1.000000;0.000000;
0.000000;1.000000;
1.000000;1.000000;
0.000000;1.000000;
1.000000;1.000000;
0.000000;0.000000;
1.000000;0.000000;
0.000000;0.000000;
1.000000;0.000000;;
}
}
09.10.2006 - 15:34 Uhr

Habe zwei Meshes. Eins davon erzeuge ich aus Mesh.Box. Und eins lade ich von einem File.

Beide werden hintereinander gerendert.
Beide haben das gleiche Vertexformat.

Nur beim geladenen funktioniert das Licht nicht. Bin ratlos, da alles gleich sein sollte.


        public void OnRenderFrameUR()
        {
            Device device = deviceUR;
            device.RenderState.CullMode = Cull.None;
            device.RenderState.ZBufferEnable = true;
            device.RenderState.ZBufferFunction = Compare.LessEqual;
            device.RenderState.ZBufferWriteEnable = true;
            device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, Color.CornflowerBlue, 1f, 0);
            rollPosX += (float)mausDeltaXUR / unten.Panel2.Width*2 * (float)Math.PI;
            mausDeltaXUR = 0;
            rollPosY += (float)mausDeltaYUR / unten.Panel2.Height*2 * (float)Math.PI;
            mausDeltaYUR = 0;
            device.Transform.World = Matrix.RotationYawPitchRoll(rollPosX,rollPosY,0);
            device.Transform.View = Matrix.LookAtLH(new Vector3(trackBarURunten.Value - 50.0f, trackBarURrechts.Value - 50.0f, abstandUR), new Vector3(trackBarURunten.Value - 50.0f, trackBarURrechts.Value - 51.0f, 0.0f), new Vector3(0.0f, 1.0f, 0.0f));
            device.Transform.Projection = Matrix.PerspectiveFovLH(1f, aspectUR, 0.1f, 100.0f);
            device.Lights[0].Type = LightType.Directional;
            device.Lights[0].Diffuse = Color.White;
            device.Lights[0].Direction = new Vector3(1.0f, 0.0f, 1.0f);
            device.Lights[0].Update();
            device.Lights[0].Enabled = true;
            // Create the material
            Material material = new Material();
            material.DiffuseColor = ColorValue.FromColor(Color.White);
            material.AmbientColor = ColorValue.FromColor(Color.White);
            device.Material = material;

            // Set render states
            device.RenderState.Lighting = false; // oder true
            device.VertexFormat = CustomVertex.PositionNormalColored.Format;
            device.BeginScene();
                device.RenderState.FillMode = FillMode.Solid;
                for (int i = 0; i < list.Length; i++)
                {
                    deviceUR.SetTexture(0, vURT[1]); // sind 3 da
                    vUR.DrawSubset(i);
                }
                meshUR.DrawSubset(0);
            device.RenderState.Lighting = false;
                device.RenderState.FillMode = FillMode.WireFrame;
                meshUR.DrawSubset(0);
            for (int i = 0; i < GitterUR.Count; i++)
                device.DrawUserPrimitives(PrimitiveType.LineList, 1, GitterUR[i]);
            device.VertexFormat = CustomVertex.PositionColored.Format;
            for (int i = 0; i < FadenKreuz.Count; i++)
                device.DrawUserPrimitives(PrimitiveType.LineList, 1, FadenKreuz[i]);
            device.EndScene();
            device.Present();

        }

Die Meshes:


            VertexFormats format = VertexFormats.PositionNormal | VertexFormats.Texture1;
            box = Mesh.Box(deviceUR, 2.0f, 3.0f, 2.0f);
            vUR = Mesh.FromFile("..\\v.x", MeshFlags.Managed, deviceUR,out list);
            vURT = new Texture[list.Length];
            for (int i = 0; i < list.Length; i++)
            {
                vURT[i] = TextureLoader.FromFile(deviceUR, "..\\"+list[i].TextureFilename);
            }
            Mesh tempBox1=vUR.Clone(vUR.Options.Value, format, deviceUR);
            vUR.Dispose();
            vUR = tempBox1;
            CustomVertex.PositionNormalTextured[] verts = (CustomVertex.PositionNormalTextured[])vUR.VertexBuffer.Lock(0,
                typeof(CustomVertex.PositionNormalTextured), LockFlags.None, vUR.NumberVertices);
            for (int i = 0; i < verts.Length; ++i)
            {
                verts[i].Y -= 3;
            }
            vUR.VertexBuffer.Unlock();


            Mesh tempBox = box.Clone(box.Options.Value, format, deviceUR);
            box.Dispose();
            box = tempBox;
            verts = (CustomVertex.PositionNormalTextured[])box.VertexBuffer.Lock(0,
                typeof(CustomVertex.PositionNormalTextured), LockFlags.None, box.NumberVertices);
            verts[0].Tu = 1; verts[0].Tv = 1; verts[1].Tv = 1; verts[3].Tu = 1; verts[4].Tv = 1;
            verts[6].Tu = 1; verts[7].Tu = 1; verts[7].Tv = 1; verts[9].Tu = 1; verts[10].Tu = 1;
            verts[10].Tv = 1; verts[11].Tv = 1; verts[12].Tv = 1; verts[14].Tu = 1; verts[15].Tu = 1;
            verts[15].Tv = 1; verts[16].Tu = 1; verts[16].Tv = 1; verts[17].Tv = 1; verts[19].Tu = 1;
            verts[20].Tv = 1; verts[22].Tu = 1; verts[23].Tu = 1; verts[23].Tv = 1;
            vertsCopy2 = verts;
            box.VertexBuffer.Unlock();


            blackBox = Mesh.Box(deviceUR, 1.5f, 0.5f, 1.5f);
            Mesh tempBox2 = blackBox.Clone(blackBox.Options.Value, format, deviceUR);
            blackBox.Dispose();
            blackBox = tempBox2;
            verts = (CustomVertex.PositionNormalTextured[])blackBox.VertexBuffer.Lock(0,
                                                            typeof(CustomVertex.PositionNormalTextured),
                                                            LockFlags.None,
                                                            blackBox.NumberVertices);
            for (int i = 0; i < verts.Length; ++i)
            {
                verts[i].X -= 3;
            }
            verts[0].Tu = 1; verts[0].Tv = 1; verts[1].Tv = 1; verts[3].Tu = 1; verts[4].Tv = 1;
            verts[6].Tu = 1; verts[7].Tu = 1; verts[7].Tv = 1; verts[9].Tu = 1; verts[10].Tu = 1;
            verts[10].Tv = 1; verts[11].Tv = 1; verts[12].Tv = 1; verts[14].Tu = 1; verts[15].Tu = 1;
            verts[15].Tv = 1; verts[16].Tu = 1; verts[16].Tv = 1; verts[17].Tv = 1; verts[19].Tu = 1;
            verts[20].Tv = 1; verts[22].Tu = 1; verts[23].Tu = 1; verts[23].Tv = 1;
            vertsCopy1 = verts;
            blackBox.VertexBuffer.Unlock();



            int numTriangles = box.NumberFaces+blackBox.NumberFaces;
            meshUR = new Mesh(numTriangles, numTriangles*3,
                 0, CustomVertex.PositionNormalTextured.Format, deviceUR);
             verts = (CustomVertex.PositionNormalTextured[])meshUR.VertexBuffer.Lock(0,
                 typeof(CustomVertex.PositionNormalTextured), LockFlags.None, meshUR.NumberVertices);
             for (int i = 0; i < 24; i++)
             {
                 verts[i] = vertsCopy1[i];
                 verts[i+24] = vertsCopy2[i];
             }
             meshUR.VertexBuffer.Unlock();
             short[] indicesBox = (short[])box.LockIndexBuffer(typeof(short), LockFlags.ReadOnly, box.NumberFaces * 3);
             box.UnlockIndexBuffer();
             short[] indicesBlackBox = (short[])blackBox.LockIndexBuffer(typeof(short), LockFlags.ReadOnly, blackBox.NumberFaces * 3);
             blackBox.UnlockIndexBuffer();
             short[] indicesMesh = (short[])meshUR.LockIndexBuffer(typeof(short), LockFlags.None, meshUR.NumberFaces * 3);
             for (int i = 0; i < 36; i++)
             {
                 indicesMesh[i] = indicesBlackBox[i];
                 indicesMesh[i+36] = (short)(indicesBox[i]+36);
             }
             meshUR.UnlockIndexBuffer();

09.10.2006 - 08:21 Uhr

Der Tip war Klasse !!!! 😁

Und soooo einfach. Man muss es nur wissen.

            device.Transform.Projection = Matrix.OrthoLH(abstandOL+15f, (abstandOL+15.0f) / aspect , 1.0f, 1000.0f);

Gruß Robert

08.10.2006 - 16:22 Uhr

Danke für den Hinweis. Werde dem nachgehen.

Gruß Robert

08.10.2006 - 08:20 Uhr

Lösung für mich:

  • Entfernung zur Kamera vergrößern.
  • Ausschnitt verkleinern.
07.10.2006 - 10:11 Uhr

Hallo herbivore,

Auf meinem Weg zum Lernen von C# und DirectX wollte ich nicht einfach irgendetwas machen.

Da habe ich mir gedacht, dass ich MiklShape ein wenig nachbaue. Dort, so denke ich, ist so ziemlich alles drin was man über Meshes wissen muss. (soll bei weitem keine Konkurenz werden) 😉

Nun bekomme ich die Seitenansichten wegen der Perspektive nicht hin. Bei einer Box z.B ist das hintere Rechteck kleiner als das vordere.

Wie kann ich das hin bekommen?

Gruß Robert

07.10.2006 - 09:24 Uhr

Ich möchte, dass Objekte die weiter weg sind sich in einem anderen Mass verkleinern.

Gruß Robert

06.10.2006 - 18:13 Uhr

Ich denke, so etwas soll das Ziel sein.

Nur Lector und ich sind noch am Anfang des Kapierens. 😉

Und ich denke, erst wenn man alle Kleinigkeiten verstanden hat kann man auch gut werden.
Arbeit: ja, aber nachher nicht mehr. Dann hat man eine Klasse wie du. Aber man versteht, was darin vor geht und kein kopiertes Zeug was man nicht begreift.

Manchmal kann ich mit dem wenigen Wissen auch jetzt schon helfen. 😁

Gruß Robert

06.10.2006 - 13:26 Uhr

Mache zwei Boxen


            float aspect = bildschirmBreite /bildschirmHöhe;
            device.Transform.View = Matrix.LookAtLH(new Vector3(0.0f, 0.0f, abstandUR), new Vector3(0.0f, -1.0f, 0.0f), new Vector3(0.0f, 1.0f, 0.0f));
            device.Transform.Projection = Matrix.PerspectiveFovLH(1f, aspect, 0.1f, 100.0f);
			device.RenderState.FillMode = FillMode.Solid;
            device.BeginScene();
            device.Transform.World = Matrix.RotationYawPitchRoll(1,1,0); // Drehen
			box.DrawSubset(0); // rendern
			device.Transform.World = Matrix.RotationYawPitchRoll(0, 0, 0); // nicht drehen
			blackBox.DrawSubset(0); // rendern
            device.EndScene();
            device.Present();

Hiermit kannst du verschieben:

device.Transform.World = Matrix.Translation(-3, -1, 0);
06.10.2006 - 12:52 Uhr

Bedeutet das dass ich für jedes Objekt ein eigenes BeginScene() und EndScene() brauche()?

Nein. Soweit ich weis: zwischen Begin und End wird alles gezeichnet, was erscheinen soll. Dann mit Present kommt es auf den Bildschirm

06.10.2006 - 10:50 Uhr

Culling ist ausgeschaltet.

Denke, es liegt am falschen zusammen basteln des neuen Meshs.

Habe jetzt die Reihenfolge geändert, dann wird die kleine Box voll und die große nur halb gezeichnet.

Bin mir noch nicht ganz sicher im Aufbau eines Meshs. 🙁

Gruß Robert

06.10.2006 - 10:31 Uhr

@VicOne

Hast recht. Hatte das auch schon verbessert, aber du warst mit deiner Antwort schneller. 😉

Bin gerade auch erst dabei mich in Meshes ein zu arbeiten.

Wenn die Verschiebung einmalig ist, so denke ich kann man dies auch benutzen.

Gruß Robert

PS: Wäre nett, wenn du dir mal meine Frage zu Meshes vor nimmst.

06.10.2006 - 10:18 Uhr

Du kannst aber auch die Werte des Meshs ändern. Weis zwar nicht ob das üblich ist, aber es geht:


            CustomVertex.PositionNormalTextured[] verts = (CustomVertex.PositionNormalTextured[])blackBox.VertexBuffer.Lock(0,
                                                            typeof(CustomVertex.PositionNormalTextured),
                                                            LockFlags.None,
                                                            blackBox.NumberVertices);
            for (int i = 0; i < verts.Length; ++i)
            {
                verts[i].X -= 3;
            }
            blackBox.VertexBuffer.Unlock();


Hier wird das Mesh um -3 in X-Richtung verschoben.

Wenn es sich aber immer bewegen soll, so ist die obere Methode sicher besser.

05.10.2006 - 16:25 Uhr

Durchs Picking bin ich drauf gekommen.

Allerding stimmt noch nicht alles. Man sieht, eine Box wird komplett gezeichent, eine nur halb. Wo habe ich den Fehler?



            VertexFormats format = VertexFormats.PositionNormal | VertexFormats.Texture1;
           
            box = Mesh.Box(deviceUR, 2.0f, 3.0f, 2.0f);
            Mesh tempBox = box.Clone(box.Options.Value, format, deviceUR);
            box.Dispose();
            box = tempBox;
            CustomVertex.PositionNormalTextured[] verts = (CustomVertex.PositionNormalTextured[])box.VertexBuffer.Lock(0,
                typeof(CustomVertex.PositionNormalTextured), LockFlags.None, box.NumberVertices);
            verts[0].Tu = 1; verts[0].Tv = 1; verts[1].Tv = 1; verts[3].Tu = 1; verts[4].Tv = 1;
            verts[6].Tu = 1; verts[7].Tu = 1; verts[7].Tv = 1; verts[9].Tu = 1; verts[10].Tu = 1;
            verts[10].Tv = 1; verts[11].Tv = 1; verts[12].Tv = 1; verts[14].Tu = 1; verts[15].Tu = 1;
            verts[15].Tv = 1; verts[16].Tu = 1; verts[16].Tv = 1; verts[17].Tv = 1; verts[19].Tu = 1;
            verts[20].Tv = 1; verts[22].Tu = 1; verts[23].Tu = 1; verts[23].Tv = 1;
            vertsCopy1 = verts;
            box.VertexBuffer.Unlock();


            blackBox = Mesh.Box(deviceUR, 1.5f, 0.5f, 1.5f);
            format = VertexFormats.PositionNormal | VertexFormats.Texture1;
            Mesh tempBox2 = blackBox.Clone(blackBox.Options.Value, format, deviceUR);
            blackBox.Dispose();
            blackBox = tempBox2;
            verts = (CustomVertex.PositionNormalTextured[])blackBox.VertexBuffer.Lock(0,
                                                            typeof(CustomVertex.PositionNormalTextured),
                                                            LockFlags.None,
                                                            blackBox.NumberVertices);
            for (int i = 0; i < verts.Length; ++i)
            {
                verts[i].X -= 3;
            }
            verts[0].Tu = 1; verts[0].Tv = 1; verts[1].Tv = 1; verts[3].Tu = 1; verts[4].Tv = 1;
            verts[6].Tu = 1; verts[7].Tu = 1; verts[7].Tv = 1; verts[9].Tu = 1; verts[10].Tu = 1;
            verts[10].Tv = 1; verts[11].Tv = 1; verts[12].Tv = 1; verts[14].Tu = 1; verts[15].Tu = 1;
            verts[15].Tv = 1; verts[16].Tu = 1; verts[16].Tv = 1; verts[17].Tv = 1; verts[19].Tu = 1;
            verts[20].Tv = 1; verts[22].Tu = 1; verts[23].Tu = 1; verts[23].Tv = 1;
            vertsCopy2 = verts;
            blackBox.VertexBuffer.Unlock();

            int numTriangles = box.NumberFaces+blackBox.NumberFaces;
            mesh = new Mesh(numTriangles, numTriangles*3,
                 0, CustomVertex.PositionNormalTextured.Format, deviceUR);
             verts = (CustomVertex.PositionNormalTextured[])mesh.VertexBuffer.Lock(0,
                 typeof(CustomVertex.PositionNormalTextured), LockFlags.None, mesh.NumberVertices);
             for (int i = 0; i < 24; i++)
             {
                 verts[i] = vertsCopy1[i];
                 verts[i+24] = vertsCopy2[i];
             }
             mesh.VertexBuffer.Unlock();
             short[] indicesBox = (short[])box.LockIndexBuffer(typeof(short), LockFlags.ReadOnly, box.NumberFaces * 3);
             box.UnlockIndexBuffer();
             short[] indicesBlackBox = (short[])blackBox.LockIndexBuffer(typeof(short), LockFlags.ReadOnly, blackBox.NumberFaces * 3);
             blackBox.UnlockIndexBuffer();
             short[] indicesMesh = (short[])mesh.LockIndexBuffer(typeof(short), LockFlags.None, mesh.NumberFaces * 3);
             for (int i = 0; i < 36; i++)
             {
                 indicesMesh[i] = indicesBox[i];
                 indicesMesh[i+36] = (short)(indicesBlackBox[i]+36);
             }
             mesh.UnlockIndexBuffer();


05.10.2006 - 15:35 Uhr

Hi,

Beschäftige mich z.Zt. mit Meshes. Aber das Verständnis ist noch nicht groß. Daher habe ich zwei Fragen:

  1. Kann man aus einem Mesh einzelne Triangles herausnehmen oder auch dazu tun?

  2. Wie komme ich an die Daten im Indexbuffer?
    habe schon einiges probiert, aber es will nicht funktionieren.
    zB.:
    Array jj= ib.Lock(1, LockFlags.None);
    oder
    ushort[] bufptr = (ushort[])ib.Lock(0, LockFlags.None);

Dann könnte ich, wenn oben das nicht geht, ein neues Mesh machen.
Da wäre nett, wenn mir jemand sagt, wo geschrieben steht wie man das machen kann.

Gruß Robert

04.10.2006 - 13:38 Uhr

Habe probiert und glaube auch gefunden, bei mir klappt das:

. 
            box = Mesh.Box(device_1, 2.0f, 3.0f, 2.0f);
            box = box.Clone(box.Options.Value, box.VertexFormat, device_2);

Hier wurde aber für etwas Ähnliches noch ein Zwischenschritt gemacht. Weis nicht, ob das wichtig ist:

.
            box = Mesh.Box(device_1, 2.0f, 3.0f, 2.0f);
            Mesh tempBox= box.Clone(box.Options.Value, box.VertexFormat, device_2);
            box.Dispose();
            box = tempBox;


04.10.2006 - 09:56 Uhr

Als mir das Wort einfiel habe ich es hier gefunden.


            PresentParameters pp = new PresentParameters();
            pp.EnableAutoDepthStencil = true;
            pp.AutoDepthStencilFormat = DepthFormat.D16;  // Oder nen höheren Wert
            deviceUR = new Device(0, DeviceType.Hardware, this.unten.Panel2, CreateFlags.HardwareVertexProcessing, pp);


            deviceUR.RenderState.ZBufferEnable = true;
            deviceUR.RenderState.ZBufferFunction = Compare.LessEqual;
            deviceUR.RenderState.ZBufferWriteEnable = true;
            deviceUR.Clear(ClearFlags.Target | ClearFlags.ZBuffer, Color.GreenYellow, 1f, 0);

Jetzt muss ich nur noch das offensichtliche Problem mit der Textur lösen.

03.10.2006 - 20:08 Uhr

@ notec

Habe alles umgestellt. Fühle mich jetzt wohler, da ich so auch mehr Hilfe erwarten kann. 😉

Aber schon kommen neue Fragen. Siehe neues Thema.

Gruß Robert

03.10.2006 - 19:46 Uhr

Bin mir sicher, darüber etwas gelesen zu haben, aber es fällt mir nicht mehr ein.

Gefühlsmäßig denke ich es ist einfach. Aber man weis ja nie.

Habe zwei Meshs (Boxen), die rotiert werden. Es soll eine Box sein, aber manche Seiten werden nicht gezeichnet und wenn etwas hinter dem anderen ist, so ist es doch sichtbar.

Wo muss ich da nachlesen?

02.10.2006 - 18:37 Uhr

Das wird es wohl sein habe 2.0.

Dann muß ich wohl alles umstellen. Hatte gedacht, dass höhere Verionsnummer auch mehr kann 8o .

02.10.2006 - 18:23 Uhr

@ notec

All das gibt es in der 2006er Form nicht so.

Mesh.NumberVertices wäre evtl. Mesh.VertexCount

Statt** CustomVertex.PositionNormalTextured[]** nur PositionNormalTextured[] aber ich glaube auch anders aufgebaut.

Mesh.LockVertexBuffer gibt nur GraphicsBuffer zurück und hat nur einen Parameter : LockFlags.

Muß ich zurückgehen, um das nutzen zu können?

02.10.2006 - 17:05 Uhr

Möchte gerne Daten eines Mesh verändern. Nun haben die Lieben mit DirectX 2006 vielesverändert.

Das Clonen ging ja noch. Nur die Daten verdreht.

Aber das bekomme ich nicht hin:

CustomVertex.PositionNormalTextured[] verts = (CustomVertex.PositionNormalTextured[])box.VertexBuffer.Lock( 0, 
				typeof( CustomVertex.PositionNormalTextured ), 
				LockFlags.None, 
				box.NumberVertices ); 

Any Help?

Robert

26.09.2006 - 18:01 Uhr

Hi neotec,

Ich bin ja auf der Suche nach dem richtigen Weg.

Sage mal meine Gedanken:

Nehme als Beispiel für mich ein Spiel: Siedler 5.

Dort kenne ich mich sehr gut aus. Allerdings nur in der Anwendung. (Maps erstellen/Scripten)

In diesem Spiel haben Sie die Auswahlmöglichkeit um Maps zu erstellen zwischen
64*64 und 768 * 768.

Sie speichern nur jede 4. Textur ab. (im savegame)

Daher müssen die zwei dazwischen eine Mischung sein. (Wenn unterschiedlich)

Und so genau, wie das hin kommt können das keine kleineren Bitmaps als 192 -256 sein.

Irgendwie muss das doch hin zu kriegen sein.

Vielleicht bringt die Endversion von XNA etwas. 😭

Robert

PS: so wie das Speil aufgebaut ist, sind maximal Teile von 4 der 64 *64 Felder sichtbar.

26.09.2006 - 11:56 Uhr

@VizOne

Sieht recht interessant aus. Evtl. genau das, was ich brauche.

Und da mein verstaubtes Englisch immer mehr zum Vorschein kommt, werde ich da schon durchblicken. 😉

Danke, werde berichten.

Robert

26.09.2006 - 11:01 Uhr

Hi Xynratron,

Es muss schon einen Unterschied zwischen Bitmaps und Textur geben. Zum einen dauert das Laden einer Bitmap nur halb so lange wie das einer Textur, zum anderen kommt beim Laden von 64 * 64 Bitmaps ein Error und beim Terrain nicht.

Trotzdem ist es eine dumme oder schlechte Idee von mir. da der Ramspeicher um 1,5 GB hochschnellt.

Es muss also einen anderen Weg geben.

Bisher habe ich trotz intensiver suche nur zwei Möglichkeiten gefunden.

Die eine ist eine Bitmap (1024 *1024) für das ganze Terrain. ==> schnell (800 FPS)

Die andere: zwei kleine Bitmaps (Gras und Steine) die je nach Höhe geblendet werden ==> langsam, aber wesendlich schöner. (60 FPS)

Hier hat quasi jedes Quad zwei Bitmaps, die mit unterschiedlicher Transparenz gerendert werden. Das wird u.a. in HLSL gemacht, wovon ich noch keine Ahnung habe. Und es sind nur zwei Bitmaps für die gesamte Map.

Was ich mir bisher gebastelt habe hat auch etwa 60 FPS. Habe aber die Befürchtung, das dies zu langsam ist, da eine Map ja nicht nur aus Terrain besteht.

Und damit die Übergänge von einem zum anderen Terrain nicht abgehackt sind, der Mischungsversuch an anderer Stelle hier. Ich wechsle bei jedem Quad die Textur.

Wenn jemandem in der Richtung etwas über den Weg läuft, wäre ich für eine Info recht dankbar.

Robert

25.09.2006 - 23:39 Uhr

@nop

Nicht dass du meinst, ich ginge nicht jedem guten Hinweis nach:

0.86345195770263672 😉 (100 Bitmaps)

Gut; und Danke

Muss zwar nicht so genau sein, aber wer weis wofür man´s mal brauchen kann.

Robert

25.09.2006 - 22:01 Uhr

Hallo herbivore,

wenn es das, was du geschrieben hast für Bitmaps auch für Texturen gäbe, dann wäre für mich die Welt in ordnung 😉 (zumindest für eine Zeit)

Robert

25.09.2006 - 21:44 Uhr

Ja herbivore,

Daran habe ich auch gedacht. Nur dazu fehlt der Speicherplatz.

möchte 64 * 64 Bilder á 256 * 256 Pixel. Macht 268,435,456 mal 3. (ohne Transparenz)

Wenn ich die Bilder einzeln zur Grafikkarte schicke, bewältigt sie das spielend. Allerdings geht FPS in gewaltig in die Knie. 60 FPS. Ohne sonst etwas auf der Map.

Die schaffen das nur, dass es vollkommen realistisch aussieht.

Wenn ich die Bilder wesendlich verkleinere..... naja.

Ich kann auch ohne weiteres alle Texturen laden. Keine Ahnung wie das gemacht wird. Aber das Ergebnis ist gut.

Daher kam der Gedanke, alles zu einer Textur zusammen zu fügen und dann mittels Index und TRIANGLE_STRIP zur Karte zu schicken.

Die Zeit der Erzeugung ist eher unwichtig. Danach geht es aber fix.

€dit: Probiert habe ich es noch nicht, wie du sagst, da ich es wegen meiner Rechnung nicht glaube.

Robert

25.09.2006 - 21:11 Uhr

Da ich bisher hier nur vernünftige Antworten bekommen habe, nehme ich an, mir kann niemand helfen.

Möchte keinen neuen Beitrag für meine Idee öffnen, darum mache ich es hier, da es dazu passt.

Man kann ja Terrain laden mit z. B :

                stream1 = Assembly.GetExecutingAssembly().GetManifestResourceStream("CUnit.Properties.Schnee1.bmp");

oder über file.

Nun interessiert mich, ob man eine Textur auch aus mehreren Stücken zusammensetzten kann. (nebeneinander und untereinander)

Bsp.: Habe 64 * 64 Bilder und möchte die zu einer Textur zusammenfügen.

Die Frage ist daher, da das einzelne Rendern der Texturen zu lange dauert. Da man mit SetTexture viel Zeit verliert. Ist es aber in einer Textur, so kann man das mit einem Aufruf der Karte gestalten.

25.09.2006 - 20:02 Uhr

@neotec

Habe ich gerade versucht. Ist auch nicht immer auf dem aktuellen Stand. Einmal 0 ; einmal 0.016

Da wird wohl, wenn es keine immer aktuelle Uhr gibt, nur der Hinweis von herbivore helfen um etwas genau zu haben.

            int t0 = Environment.TickCount;
            int jetzt = DateTime.Now.Millisecond + DateTime.Now.Second * 1000;
            for(int i=0;i<100;i++)
                 MischeBitmap2();
            int dauer = DateTime.Now.Millisecond + DateTime.Now.Second * 1000 - jetzt;
            int t1 = Environment.TickCount;
            float dauer2 = (float)(t1 - t0) / 1000f;

Kommt bei beiden Versionen 844 mS heraus. €dit: 859 mit Abspeichern jeweils.

Danke.

Falls es interessiert:

25.09.2006 - 19:47 Uhr

UUps. Das war schnell 😉

Mir ist gerade aufgefallen, dass es so sein könnte wie bei LUA.

http://robertico.ro.funpic.de/os.php#os.clock

Da ist es so:

Diese Funktion liefert eine Annäherung der vom Programm benutzten Rechnerzeit in Sekunden.

rechnerZeit = os.clock()  
  

os.clock wird etwa alle 15-16 1000tel Sekunden aktualisiert. Den genauen Wert hat man also so gut wie nie. Damit kann man aber leben. Das ist fast doppelt so schnell, wie der Mensch sehen kann.

Danke für die super-schnelle Antwort.

Robert

25.09.2006 - 19:28 Uhr

Weil ich zwei gleiche Bitmaps mit Hilfe einer Maske(schwarz / weis) mischen wollte, bin ich auch auf das Problem gestoßen, dass GetPixel/SetPixel zu langsam sind. Und dadurch auf diesen Beitrag.

Meine erste Funktion dauerte pro Bitmap 5900 mS.

Alle Bitmaps haben die gleich Größe.

        public int MischeBitmap()
        {
            int jetzt = DateTime.Now.Millisecond + DateTime.Now.Second * 1000;
            Bitmap kk = new Bitmap(256, 256);
            Bitmap k1 = new Bitmap(Utility.GetMediaFile("Schlamm1.bmp"));
            Bitmap k2 = new Bitmap(Utility.GetMediaFile("Grass.bmp"));
            Bitmap maske = new Bitmap(Utility.GetMediaFile("MaskO2n.bmp"));
            for (int x = 0;x<256;x++)
                for (int y = 0; y < 256; y++)
                {
                    Color zwisch = maske.GetPixel(x,y);
                    if (zwisch.ToArgb() == Color.White.ToArgb())
                    {
                        kk.SetPixel(x, y, k1.GetPixel(x, y));
                    }
                    else
                    {
                        kk.SetPixel(x, y, k2.GetPixel(x, y));
                    }
                }
            kk.Save("C:\\Temp\\versuch.png");

            int dauer = DateTime.Now.Millisecond + DateTime.Now.Second * 1000 - jetzt;
            return dauer;
        }

Dann habe ich, da alles bekannt ist, es so versucht:

        public long MischeBitmap2()
        {
            int jetzt = DateTime.Now.Millisecond + DateTime.Now.Second * 1000;
            byte[] schlamm = new byte[196608];
            byte[] grass = new byte[196608];
            byte[] maske = new byte[196608];
            byte[] ergebnis = new byte[196662];
            
            Stream stSchlamm = File.OpenRead(Utility.GetMediaFile("Schnee1.bmp"));
            Stream stGrass = File.OpenRead(Utility.GetMediaFile("Grass.bmp"));
            Stream stMaske = File.OpenRead(Utility.GetMediaFile("MaskO2n.bmp"));
            Stream stErgebnis = File.OpenWrite(Utility.GetMediaFile("versuch.bmp"));
            stSchlamm.Seek(54, SeekOrigin.Begin);
            stSchlamm.Read(schlamm, 0, 196608);
            stSchlamm.Close();
            stGrass.Seek(54, SeekOrigin.Begin);
            stGrass.Read(grass, 0, 196608);
            stGrass.Close();
            stMaske.Seek(54, SeekOrigin.Begin);
            stMaske.Read(maske, 0, 196608);
            stMaske.Seek(0, SeekOrigin.Begin);
            stMaske.Read(ergebnis, 0, 54);
            stMaske.Close();
            for (int i = 0; i < 196608;i++ )
            {
                if (maske[i]==0)
                    ergebnis[i+54]=schlamm[i];
                else
                    ergebnis[i + 54] = grass[i];

            }
            stErgebnis.Write(ergebnis, 0, 196662);
            stErgebnis.Close();
            int dauer = DateTime.Now.Millisecond + DateTime.Now.Second * 1000 - jetzt;
            return dauer;
        }

Das ist sicher nicht beste Sahne, aber hier dauern 100 Bitmaps 780 mS;

Nun habe ich auch eine Frage dazu:

Der Wert der Dauer ist manchmal 0. Auch wenn ich ticks abfrage 0. Da ich keine Zeitmaschine habe, 😉 kann ich das nicht glauben.

Wenn ich die zweite Version einzeln mache, dann kommt manchmal 0 und manchmal 15. Im Schnitt also ca. 8.

Was ist da falsch???

12.09.2006 - 18:12 Uhr

Möchte ein Terrain erstellen mit vielen verschiedenen Texturen.
Um das zu lernen habe ich mir ein Projekt genommen:

http://www.codeproject.com/cs/media/terrainrendering.asp?df=100&forumid=101594&fr=26&select=1665398&msg=1665398

und für meine Zwecke umgebaut.

-- primitive, aber zunächst ausreichende, Camera
-- Diverse Funktionen in Lua
-- u.a Änderung der Höhen per Lua - Script

Soweit kein Problem ( außer den sicher für eure Augen unsauberen Code ) [es funzt aber]

So, jetzt das Terrain(Texturen). Ich habe keine Ahnung, wie ich dies verändern kann.

Im o.g. Beispiel werden durchgängig nur zwei verschiedene Texturen benutzt.
Oben Felsen, unten Gras.

Wie kann ich sinnvoll jedes Quadrat mit einer eigenen Textur versehen? (Wenn ich eins weis, weis ich alle)

Habe mal ein Spiel mit Terrain erforscht. Diese setzen jede 4erte Textur( X und Z ) und dazwischen wird vermutlich gemischt.

Mein Projekt:

http://robertico.ro.funpic.de/TerrainLua.7z

Wie gesagt: Lacht nicht.

Nötig ist:

DirektX für Managed Code herunter laden:
http://www.microsoft.com/downloads/details.aspx?FamilyId=A1788990-5E11-4AE2-B5E7-CC576822AED4&displaylang=en

Gruß Robert

11.09.2006 - 08:58 Uhr

Original von talla
Es liegt ja nicht an DirectX an sich, das kann man schon auf Windows Maschienen als vorhanden ansehen, sondern an den managed Extensions die ja mit dem SDK mitkommen, die muss man also mitliefern. Am einfachsten ist des indem man einfach bei den Referenzen solche, nicht .Net Framework Assemblies , auf LocalCopy true stellt, so dass die immer in den Ordner kopiert werden. Dann kann man auch nichts vergessen.

Der Tipp war auch gut. Bei einem anderen funktioniert es jetzt auch ohne das obige Laden.

10.09.2006 - 18:17 Uhr

Wurde parallel probiert.

Habe jemanden gesagt, er soll sich DirektX für Managed Code herunter laden:
http://www.microsoft.com/downloads/details.aspx?FamilyId=A1788990-5E11-4AE2-B5E7-CC576822AED4&displaylang=en
Und siehe da es klappt.

Bin euch unendlich Dankbar habe lange gesucht bevor ich fragte.

Wenn mal etwas mit Lua ist einfach nur fragen. Ich lerne immer mehr über den Gebrauch von Lua in C# 2005

Mit vielem Dank und Grüßen Robert

10.09.2006 - 17:57 Uhr

Ja,
hatte ich gerade erweitert.

Am besten, ich liefere den ganzen Order mit, oder reichen die zwei benötigten DLLs?

PS: Danke für die schnelle Hilfe

10.09.2006 - 17:48 Uhr

@talla

Danke danke,

Nun muss ich noch wissen, welche Assemlies das sind. Da dort Microsoft.DirectX erwähnt ist, vermute ich, dass es diese sind:

using Microsoft.DirectX;
using Microsoft.DirectX.Direct3D;

Kann ich das so programmieren, dass ich feststellen kann, was benötigt wird?

Vielleicht sagt das etwas:

C:\WINDOWS\Microsoft.NET\DirectX for Managed Code\1.0.2902.0\Microsoft.DirectX.dll

10.09.2006 - 17:20 Uhr

Die anderen haben allenfalls etwas Ahnung von Lua.

Eine detailierte Fehlermeldung kommt nicht.

Hatte die Hoffnung, dass sich das jemand lädt und startet.

Bin der Betreiber der Webseite, falls jemand schlimmes befürchtet.

http://robertico.ro.funpic.de/ (LUA für Anfänger)

Achja: Ich kenne c# seit etwa zwei Wochen

Finde es super, weis aber nicht viel.

10.09.2006 - 17:05 Uhr

Wenn ich eine hätte, hätte ich das sicherlich getan. Bei mir funktioniert das einwandfrei.

10.09.2006 - 16:57 Uhr

Sie erhalten einen Ausnahmefehler oder ein anderer nichts.

Wie kann ich feststellen, was bei den anderen fehlt.

Laden kann man es hier:

http://robertico.ro.funpic.de/terrainVersuch.7z

Es ist dort Lua eingebunden. Die LUA-Dateien die dabei sind sind etwas unordentlich. (Versuch)

Für Hilfe und Verschiebung, falls mein Gewählter Ort nicht richtig ist, wäre ich sehr Dankbar.

Gruß Robert

PS: Vielleich noch interessant:

using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Data;
using System.Reflection;
using System.IO;
using System.Diagnostics;
using Microsoft.DirectX;
using Microsoft.DirectX.Direct3D;
using LuaInterface;