21. marts 2007 - 18:28Der er
14 kommentarer og 1 løsning
DirectX managed, 3D Grid
Hejsa Eksperter.
Ved ikke lige om det er det rigtige sted at spørge, men..
Jeg har en app. som jeg er ved at lave til en bane editor, og i den har jeg en picture box som jeg renderer på, og et kamera i scenen (isometric view).
nu er det så sådan at jeg gerne vil tegne et 3d grid i scenen, men jeg kan ikke rigtig finde nogle gode løsninger på det.
nogen der har prøvet at lavet dette ? eller ved hvordan man lige kan bære sig an ?.
Denne side indeholder artikler med forskellige perspektiver på Identity & Access Management i private og offentlige organisationer. Artiklerne behandler aktuelle IAM-emner og leveres af producenter, rådgivere og implementeringspartnere.
Jeg bruger normalt OpenGL som API til at rendere 3D grafik, men jeg kan dog også i nødstilfælde lave applikationer i Direct3D. Hvis du bare vil have tegnet en 3D grid, altså dele rummet ind i uniform boxes kan du gøre det via 3 løkker. Jeg har lavet et lille eksempel til dig nedenfor som læser et 3DGrid ind i et vertexbuffer klar til rendering:
private void intitalizeGrid(Direct3D.Device device, int intGridLength, int intGridSpace) { m_lst = new System.Collections.Generic.List<CustomVertex.PositionColored>();
CustomVertex.PositionColored v; int step = intGridSpace;
for (int j = 0; j <= intGridLength * 2; j += step) { for (int i = 0; i <= intGridLength * 2; i += step) { for (int k = 0; k <= intGridLength * 2; k += step) { //Draw X-lines v = new CustomVertex.PositionColored(); v.Position = new Vector3(-intGridLength, -intGridLength + i, -intGridLength + j); v.Color = Color.Red.ToArgb(); m_lst.Add(v); v = new CustomVertex.PositionColored(); v.Position = new Vector3(intGridLength, -intGridLength + i, -intGridLength + j); v.Color = Color.Red.ToArgb(); m_lst.Add(v);
//Draw Y-lines v = new CustomVertex.PositionColored(); v.Position = new Vector3(-intGridLength + k, -intGridLength, -intGridLength + j); v.Color = Color.Red.ToArgb(); m_lst.Add(v); v = new CustomVertex.PositionColored(); v.Position = new Vector3(-intGridLength + k, intGridLength, -intGridLength + j); v.Color = Color.Red.ToArgb(); m_lst.Add(v);
//Draw Z-lines v = new CustomVertex.PositionColored(); v.Position = new Vector3(-intGridLength + k, -intGridLength + i, -intGridLength); v.Color = Color.Red.ToArgb(); m_lst.Add(v); v = new CustomVertex.PositionColored(); v.Position = new Vector3(-intGridLength + k, -intGridLength + i, intGridLength); v.Color = Color.Red.ToArgb(); m_lst.Add(v); } } }
jeg kan ikke se grid, så den med en anden kamera setup, men bruger denne her pt.
public static int viewWidth = 800; public static int viewHeight = 600; public static float rotation = 0.0f; public static float camx = 0.0f; public static float camy = 0.0f;
public static void CameraPositioning(Device device) { // get camera vectors float width = (float)viewWidth; float height = (float)viewHeight; float centerX = width / 2.0f; float centerY = height / 2.0f; Vector3 cameraPosition = new Vector3(camx, camy, -5.0f); Vector3 cameraTarget = new Vector3(camx, camy, 0.0f);
Javel så du skal have lavet en 2D-grid, har ændret metoden så der laves en 2D grid centreret omkring 0 i stedet. Grid'en er placeret i xy-planen (dvs z = 0). :)
private void intitalizeGrid(Direct3D.Device device, int intGridLength, int intGridSpace) { m_lst = new System.Collections.Generic.List<CustomVertex.PositionColored>();
CustomVertex.PositionColored v;
for (int j = 0; j <= intGridLength * 2; j += intGridSpace) { v = new CustomVertex.PositionColored(); v.Position = new Vector3(-intGridLength, -intGridLength + j, 0); v.Color = Color.Red.ToArgb(); m_lst.Add(v); v = new CustomVertex.PositionColored(); v.Position = new Vector3(intGridLength, -intGridLength + j, 0); v.Color = Color.Red.ToArgb(); m_lst.Add(v);
v = new CustomVertex.PositionColored(); v.Position = new Vector3(-intGridLength + j, -intGridLength, 0); v.Color = Color.Red.ToArgb(); m_lst.Add(v); v = new CustomVertex.PositionColored(); v.Position = new Vector3(-intGridLength + j, intGridLength, 0); v.Color = Color.Red.ToArgb(); m_lst.Add(v); }
Og så vidt jeg kan se ud fra dit kode er kameraet placeret i (0, 0, -5) og kigger på (0, 0, 0) med en up-vektor på (0, 1, 0). Med den konfiguration burde du kunne se grid'et, specielt fordi du kigger på (0, 0, 0) og grid'en har center i origo.
Prøv at ændre lidt på indstillingerne for en sikkerhedsskyld. Prøv f.eks. at sætte cameraTarget til:
Vector3 cameraTarget = new Vector3(camx, camy, 1.0f);
Dvs. at du renderer scenen i et ortogonalt view og alt derfor fremkommer som 2D. Hvis du vil have et 3D view skal du rendere scenen i et perspektiverisk view. Dvs. noget i stil med:
Og for at vise at det ikke bare er et 2D view kan du jo prøve at rykke lidt på kameraets øjeposition. Så prøv at bruge denne her metode i stedet og se forskellen:
public static void CameraPositioning(Direct3D.Device device) { camx = 0; camy = -5; // get camera vectors float width = (float)viewWidth; float height = (float)viewHeight; float centerX = width / 2.0f; float centerY = height / 2.0f; Vector3 cameraPosition = new Vector3(camx, camy, -5.0f); Vector3 cameraTarget = new Vector3(0, 0, 0.0f);
Så smider jeg lige et svar, og prøv at indsæt din renderings metode hvor scenen og grid'en bliver tegnet. Så skal jeg prøve at se om jeg kan gennemskue hvor farven bliver af! :)
Men det hele kommer lidt an på hvordan du sætter lyset op i 'light.UpdateLights(device);', for det er helt sikkert der du slår noget til som gør at vertex farverne i grid'en ikke har nogen effekt. Det ville meget typisk være en sådan en her sætning der 'ødelagder' grid farven (som jeg satte til rød):
Ahh, det er selvfølgelig fordi du ikke disabler lighting helt (kun ved det enkelte light-source) når du tegner grid'en. Du behøver ikke nogen shading på en grid (idet den er wireframe), så derfor er det fint du tegner grid'en uden lys. Hvis du vil have shading på grid'en kan du bruge 'PositionNormalColored' til at lave linjepunkterne i stedet, det er dog ikke nødvendigt i dette tilfælde da det er sjældent man vil have shading på wireframe modeller.
Så prop du dette ind så skal du se flotte farver på din Grid:
Ok smukt! Og det var så lidt. Skriv endelig hvis der opstår andre problemer, rart at der endelig dukker spørgsmål op indenfor 3D grafik. :)
Tak for pointene... :)
Mvh.
- Snap
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.