Laden...

Forenbeiträge von bezarre Ingesamt 22 Beiträge

13.06.2014 - 11:02 Uhr

Hallo,

eine fix & fertige Lösung möchte ich nicht haben.

Was ich bisher gemacht habe? Najai ch habe versucht mittels VertexBuffer & IndexBuffer einen Tetraeder zu erstellen. Das hat ansich auch ganz gut geklappt.


[...]
         public void VertexDeclaration()
         {
             vb = new VertexBuffer(typeof(CustomVertex.PositionColored), 5, device, Usage.Dynamic | Usage.WriteOnly, CustomVertex.PositionColored.Format, Pool.Default);
 
             vertices = new CustomVertex.PositionColored[5];
             vertices[0].Position = new Vector3(0f, 0f, 0f);
             vertices[0].Color = Color.White.ToArgb();
             vertices[1].Position = new Vector3(5f, 0f, 0f);
             vertices[1].Color = Color.White.ToArgb();
             vertices[2].Position = new Vector3(2.5f, 5f, -2.5f);
             vertices[2].Color = Color.White.ToArgb();
             vertices[3].Position = new Vector3(0f, 0f, -5f);
             vertices[3].Color = Color.White.ToArgb();
             vertices[4].Position = new Vector3(5f, 0f, -5f);
             vertices[4].Color = Color.White.ToArgb();
 
             vb.SetData(vertices, 0 ,LockFlags.None);
         }

         public void IndicesDeclaration()
         {
             ib = new IndexBuffer(typeof(int), 18, device, Usage.WriteOnly, Pool.Managed);
             indices = new int[]
                 {
                     0,1,2,
                     1,4,2,
                     4,3,2,
                     3,1,2,
                     3,1,2,
                     2,3,4
                 };
 
 
             ib.SetData(indices, 0, LockFlags.None);
         }

Die Darstellung habe ich dann in "onPaint" mittels folgendem Code umgesetzt:


device.BeginScene();
device.VertexFormat = CustomVertex.PositionColored.Format;
 
device.SetStreamSource(0, vb, 0);
device.Indices = ib;

device.DrawIndexedPrimitives(PrimitiveType.TriangleList, 0, 0, 5, 0, 6);
 
device.EndScene();
 
device.Present();

Ich habe mich hierbei sehr stark an einer der genannten Seiten orientiert. Ich kriege in einem Testprojekt auch einen Tetraeder dargestellt.

Ich würde nun aber gerne das Ganze über ein Mesh Objekt realisieren und an dieser Stelle komme ich nicht weiter.

Gruß
bez

12.06.2014 - 15:52 Uhr

Hallo alle zusammen,

ich bin immer noch dabei mit Managed DirectX zu programmieren und bin gerade mal wieder an ein kleines Problem gekommen.

Ich habe bisher immer auch die vordefinierten Mesh-Arten zurückgreifen können. Jetzt möchte ich aber ein eigenes Mesh "produzieren".

Um genau zu sein möchte ich einen Tetraeder erstellen. Ich habe nun etwas das Internet durchsucht und bin dabei z.B. auf
Creating a mesh with multiple subsets oder auf Recycling vertices using inidices gestoßen.

Leider konnte ich daraus nicht wirklich eine Lösung für mich ableiten.

Ich hoffe daher, dass mir einer von euch helfen kann.

Beste Grüße
bez

01.04.2014 - 16:02 Uhr

Hallo alle zusammen,

ich stehe hier gerade vor einem größeren Problem, was wahrscheinlich für euch keins ist... hoffentlich

Ich habe eine 512x512 Pixel große, wiederholbare Grafik, welche ich als Textur auf ein BoxMesh legen will. Ich will die Box nur an einer Seite texturieren.

Die Boxen können in meinem Programm beliebig oft erstellt werden und in beliebigen Größen. Die Texturen sollen natürlich immer vernünftig aussehen. Und genau hier liegt mein Problem.

Ist die Box schmal, so wirken die Texturen gestreckt etc. (siehe Anhang)

Ich habe festgestellt, dass wenn ich eine 90x90 Box habe, dann dann relativ genau 4x4 Texturen auf diesen passen. Kann das sein? Ich dachte mir dann, dass ich einfach dieses Verhältnis übertragen kann, aber das passt irgendwie nicht.

Die Texturkoordinaten berechne ich aktuell so:


float tex_coords_w = 4.0f / 90;
float tex_coords_h = 4.0f / 90;

mesh = Mesh.Box(d3dDevice, width, height, 0);

            Mesh tempMesh = mesh.Clone(mesh.Options.Value, VertexFormats.PositionNormal | VertexFormats.Texture1, d3dDevice);
            CustomVertex.PositionNormalTextured[] vertData = (CustomVertex.PositionNormalTextured[])tempMesh.VertexBuffer.Lock(0, typeof(CustomVertex.PositionNormalTextured), LockFlags.None, tempMesh.NumberVertices);
            for (int i = vertData.Length / 2; i < vertData.Length; i += 4)
            {
                vertData[i + 1].Tu = Convert.ToSingle(i) + 0.0f;
                vertData[i + 1].Tv = Convert.ToSingle(i) + 0.0f;
                vertData[i + 2].Tu = Convert.ToSingle(i) + tex_coords_w * width;
                vertData[i + 2].Tv = Convert.ToSingle(i) + 0.0f;
                vertData[i + 3].Tu = Convert.ToSingle(i) + tex_coords_w * width;
                vertData[i + 3].Tv = Convert.ToSingle(i) + tex_coords_h * height;
                vertData[i + 0].Tu = Convert.ToSingle(i) + 0.0f;
                vertData[i + 0].Tv = Convert.ToSingle(i) + tex_coords_h * height;
            }
            tempMesh.VertexBuffer.Unlock();



            mesh.Dispose();
            mesh = tempMesh;

Kann mir jemand weiterhelfen? Ich komme an dieser Stelle einfach nicht weiter.

Danke & Gruß

Achja: Die Box in der Grafik hat folgende Abmessung: width: 28.723, height: 56.43661

26.03.2014 - 10:56 Uhr

Hallo,

ich habe irgendwie ein Problem, dem ich nicht so wirklich Herr werde und auch einfach nicht verstehe, warum es so ist, wie es ist...

Ich habe folgenden Code:


float f = 2,61540f;
double d = (int)(Convert.ToDouble(f)*100000.0);
d /= 100000.0;

Also ich möchte eigentlich nichts anderes, als den Wert einer floatVariable in eine double Variable zu übertragen. Ich habe festgestellt, dass bei einer einfachen Zuweisung sehr viele Nachkommastellen dazukommen, die das Ergebnis extrem verfälschen.

Daher habe ich das Ganze auf diesem Weg probiert. Lasse ich mit den Wert von d ausgeben nach der 2. Zeile so kriege ich 261540 als Ergebnis, also genau das was ich will... nach der 3. Zeile habe ich aber wieder die ungewünschten Nachkommastellen.

Woran liegt das? Ich verwende .NET 3.5 & x86 im Debug Modus.

Gruß
bez

16.03.2014 - 20:56 Uhr

Hallo alle zusammen,

Ich hätte mal ein Frage bzgl. ManagedDX und halbtransparenz.

Wie kann ich dafür sorgen, dass ein Mesh (mit Textur) halb transparent dargestellt wird?

Gruß bez

27.02.2014 - 21:07 Uhr

Hallo Christian,

schau dir mal bitte die Grafik im Anhang an.

Die obere und untere Box haben folgende Werte:

width: 40
height: 20
depth: 1

Die mittlere Box hat diese Werte:

width: 17,5
height: 5
depth: 1

Ich habe die Translation auf folgende Werte gesetzt:

Top:
x = 0
y = 12,5
z = 30

Middle:
x = -10,5
y = 0
z = 30

Bottom:
x = 0
y = -12,5
z = 30

Wie du siehst, scheint die mittlere Box nach hinten verschoben zu sein.

Gruß
bez

27.02.2014 - 14:24 Uhr

Hallo alle zusammen,

ich möchte aktuell 3 Boxen (Mesh.Box) unter einander anordnen.

Die obere und die untere Box sollen gleich groß sein. Die mittlere Box ist halb so lang, wie die beiden anderen Boxen.

Die mittlere Box soll so angeordnet sein, dass die Box direkt an die linke Außenkante der bieden anderen Boxen anschließt. Es soll also eine Art von "C" entstehen.

Ich möchte die Boxen nun gleichermaßen nach links und rechts verschieben können. Dabei fiel mir auf, dass die mittlere Box sich von den anderen entfernt, da der Z Wert natürlich ein anderer sein muss (meine Annahme), als bei den beiden größeren Boxen.

Nun würdem ich interessieren, wie ich Z berechne bzw. wie ich dafür sorge, dass die alle in einer Ebene sind.


d3dDevice.Transform.World = Matrix.Translation(box_position_x, box_position_y + new_height_topbottom, 30.0f);
MeshItems[0].DrawSubset(0);

                    // Bottom
d3dDevice.Transform.World = Matrix.Translation(box_position_x, box_position_y - new_height_topbottom, 30.0f); 
MeshItems[0].DrawSubset(0);

                    // Left
d3dDevice.Transform.World = Matrix.Translation(box_position_x - new_width_leftright, box_position_y, 29.0f); ;
 MeshItems[1].DrawSubset(0);

Gruß
Bez

27.02.2014 - 10:11 Uhr

Meintest du das hier:

 
Mesh tempMesh = sphereMesh.Clone(sphereMesh.Options.Value, VertexFormats.PositionNormal | VertexFormats.Texture1, device);

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

for (int i = 0; i < vertData.Length; ++i)
{
     vertData[i].Tu = (float)(1.0 - (double)(0.5f + Math.Atan2(vertData[i].Nz, vertData[i].Nx) / (Math.PI * 2)));
     vertData[i].Tv = (float)(0.5f - Math.Asin(vertData[i].Ny) / Math.PI);
}

tempMesh.VertexBuffer.Unlock();

device.RenderState.CullMode = Cull.None;
device.RenderState.Wrap0 = WrapCoordinates.Zero;

Gruß
Bez

26.02.2014 - 20:46 Uhr

Hallo,

Ein Filter Problem? Hmmm... mit welchen Befehlen werden Filter gesetzt bzw. konfiguriert? Würde dann alle passenden Befehle Posten... hab sonst leider kein Plan was ich posten soll.

Wenn ich das Fenster resize ist der Fehler übrigens weg.

Gruß bez

26.02.2014 - 16:51 Uhr

Hallo,

ich texturiere meine Sphere (entsntanden aus Mesh.Sphere) mit z.B. der Erde.

Ich kriege nun an genau einer Stelle das Problem, welche der Anhangsgrafik zuentnehmen ist. Es findet kein direkten Anschluss der Außenkanten statt.

Ich lasse Tu und Tv wie folgt erstellen:


vertData[i].Tu = 1 - (float)(0.5f + Math.Atan2(vertData[i].Nz, vertData[i].Nx) / (Math.PI * 2));
vertData[i].Tv = (float)(0.5f - Math.Asin(vertData[i].Ny) / Math.PI);

Kann mir jemand sagen, was ich machen kann, damit der Fehler nicht mehr auftritt? Ich hatte schon was, von in Pixel Shader auslagern gelesen. Habe aber aktuell kein Plan wie dies geht.

Danke & Gruß
Bez

26.02.2014 - 14:59 Uhr

Huhu,

ich benutze zwar unterschiedliche threads, der Fehler war aber ein viel.... dämli.... 😉

Ich habe die onPaint Methode überladen und hatte dort, da ich anfangs ohne jegliche Bedienelemente gearbeitet habe, noch this.Invalidate() drinne stehen.

Das habe ich gerade mal auskommentiert... Danke für deine Tips.

Update:

Jetzt habe ich aber ein anders Problem. Ich habe auf meinem Panel ein MouseUp & MouseDown Event drauf.
Das funktioniert nicht mehr, wenn ich nicht this.Invalidate() aufrufen. Warum?

Ich rufe in onPaint aktuell auch meine onRender Methode auf... sollte ich das ändern?

Update #2:
So gelöst: My last post on render loops (hopefully)..

26.02.2014 - 14:18 Uhr

Hallo alle zusammen,

ich habe aktuell ein sehr spatanisches Formular.

Ich habe ein Panel, in das ich eine DirextX Geschichte reinladen lasse und rechts daneben einen Button.

Starte ich die application nun, kriege ich das folgende Bild (siehe Anhang). Der Button wird nicht als button, sondern als weiße Fläche angezeigt.

Klicke ich nun auf den button, so erscheint er ganz normal dargestellt.

Hat jemand sowas schon mal gehabt und kann mir sagen, woran das liegt?

Gruß
bez

26.02.2014 - 14:13 Uhr

Hallo,

ja hatte ich... ich bin mittlerweile selber drauf gekommen.

Was ich wollte: Eine Oberfläche mit WinForms bauen und eine directX Ausgabe in z.B. einem Panel.

Das Problem war, dass ich die Methode InitializeComponent überschrieben hatte...

Danke & Gruß

26.02.2014 - 11:41 Uhr

Hallo alle zusammen,

ich habe schon wieder ein Anliegen.

Diesmal geht es mir darum, wie ich ein Form (z.B. mit WinForms) erstellen kann und dort ein Bereich festlegen kann in dem die DirectX Ausgabe erfolgt.

Mir geht es darum, dass ich oben meine Leiste mit Datei, Bearbeiten, etc. habe und dann möchte ich gerne links ein paar Buttons unterbringen.

Kann mir jemand einen Tip geben?

Danke & Gruß
Bez 😃

26.02.2014 - 11:35 Uhr

Das Problem ist gelöst... 😃

Ich habe die Matrizen, die ich aktuell für die Weltrotation genommen habe, auf die View mit angewendet.

Danke für die Hilfe 😃 Manchmal steht man halt echt auf dem Schlauch...

25.02.2014 - 23:47 Uhr

Hallo Christian,

kannst du mir ein kleines Beispiel geben, wie genau ich das realisieren kann z.B. die Kamera um 90° zu drehen?

Danke

25.02.2014 - 20:34 Uhr

hallo,

das müsste das hier sein:


d3dDevice.Transform.View = Matrix.LookAtLH( new Vector3(0.0f, 0.0f, cameraz_pos), // Camera position
                                                        new Vector3(0.0f, 0.0f, 0.0f),   // Look-at point
				                                        new Vector3(0.0f, 1.0f, 0.0f));  // Up vector

d3dDevice.Transform.World = Matrix.RotationY(rotationX) * Matrix.Invert(Matrix.RotationX(rotationY));

d3dDevice.Transform.Projection = Matrix.PerspectiveFovLH(Geometry.DegreeToRadian(zoom_current), (float)this.ClientSize.Width / this.ClientSize.Height, 0.1f, 100.0f);

Außerdem lege ich die Box wie folgt an:

MeshItems = new Mesh[1];
MeshItems[0] = Mesh.Box(device, 10, 5, 1);
tempMesh = MeshItems[0].Clone(MeshItems[0].Options.Value, Vertex.FVF_Flags, device);

Vertex[] vertData1 =
            (Vertex[])tempMesh.VertexBuffer.Lock(0, typeof(Vertex),
                                                   LockFlags.None,
                                                   tempMesh.NumberVertices);

for (int i = 0; i < vertData1.Length; ++i)
    vertData1[i].color = Color.Blue.ToArgb();

tempMesh.VertexBuffer.Unlock();

MeshItems[0].Dispose();
MeshItems[0] = tempMesh;

Und dann anschließend:

Matrix TranslationToSphere = Matrix.Identity;
TranslationToSphere.Translate( 0.0f, 0.0f, 50.0f );
d3dDevice.Transform.World =  TranslationToSphere;
MeshItems[0].DrawSubset(0);

Gruß
Bez

25.02.2014 - 18:14 Uhr

Hallo,

Ich habe mir einen Panoramaviewer gebaut. Also eine texturierte Sphere in der ich drinne stehe und mich wie schon gesagt drehen kann. Auch zoomen ist möglich.

Ich möchte wie schon gesagt eine Box darin erstellen. Die Box habe ich auch bereits, leider kriege ich sie nicht fixiert. Sie dreht sich mit, wenn ich mich drehe. Hast du eine Link zum Tut für mich?

Gruß bez

25.02.2014 - 16:26 Uhr

Hallo alle zusammen,

ich habe folgendes Problem. Ich befinde mich in einer Welt in der ich mich nach links, rechts, oben und unten drehen kann.

Nun möchte ich eine Box erstellen, die z.B. immer bei 0° liegen soll. Soll heißen, dass wenn ich mich nach links drehe die Box langsam nach rechts verschwindet und bei z.B. 330° (oder so) langsam wieder von links reinkommt.

Kann mir jemand einen Tip geben, wie ich das machen kann?

Danke euch!

31.01.2014 - 10:12 Uhr

Hallo alle zusammen,

ich habe da nochmal ein Anliegen.

Ich befinde mich in einem 3D Raum und möchte "Zoomen" bzw. den Camera Blickwinkel einschränken.

Gibt es dafür eine Funktion bzw. Methode? Kann mir jemand einen Tip geben?

Gruß
bezarre

Update: Die Lösung liegt in d3dDevice.Transform.Projection

31.01.2014 - 10:09 Uhr

Hallo,

jaaa irgendwie ist mir kurz vor deiner Antwort auch so eine großartige Idee gekommen.

Ich habe

Matrix.RotationY

und

Matrix.RotationX

verwendet und schon lief das Ganze.

Danke für deine Antwort.

30.01.2014 - 16:19 Uhr

Hallo alle zusammen,

ich habe ein kleines Problem bei dem mir sicherlich jemand von euch schnell auf die Sprünge helfen kann.

Ich habe eine Kugel und möchte diese mittels der Pfeiltasten nach links bzw rechts und nach oben bzw. unten drehen.

Ich nutze c# mit Managed DirectX. Das zu gehörige Event (Tasten druck) fange ich bereits ab und merke zähle jeweils für X (links bzw. rechts) und Y (hoch bzw. runter) einen Wert hoch bzw. runter.

Diesee Werte habe ich dann ganz naiv in


d3dDevice.Transform.World = Matrix.RotationYawPitchRoll(rotationX, rotationY, 0.0f);

eingegeben. doch habe ich jetzt die Kugel bereits um X verschoben so fange ich beim nach oben bzw. unten gehen an Kreise zu drehen, was ja nicht gewollt ist. Ich stehe im moment völlig auf dem Schlauch... ich hoffe jemand kann mir da weiterhelfen.

Danke euch!

Gruß
Bezarre