.[ ČeskéHry.cz ].
Direct3D Mobile - picking objects

 
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> 3D API / 3D Enginy
Zobrazit předchozí téma :: Zobrazit následující téma  
Autor Zpráva
KuboSVK



Založen: 13. 03. 2008
Příspěvky: 40

PříspěvekZaslal: 13. březen 2008, 17:09:26    Předmět: Direct3D Mobile - picking objects Odpovědět s citátem

Zdar,
momentalne pracujem na jednej aplikacii pre PDA(Windows Mobile 5.0, .NET Compact Framework) a riesim jeden problem. Ide o tzv picking of objects (oznacovanie objektov v scene mysou - stylusom).
Chcem zistit, na aku stranu kocky v scene uzivatel klikol (resp, aky face bol vybrany). Riesit tento problem v klasickom Direct3D API a nie v Direct3D Mobile API (orezane Direct3D API) by nebol problem. Su tam metody, s ktorymi by bol tento problem lahko riesitelny. Tak som to musel cele programovat ja. Mam urobene dve metody, ktore mi zistia, ci som klikol na objekt v scene:

private void CreateObjectBouding()
{
GraphicsStream graphicStream = this.preparedMesh.VertexBuffer.Lock(0, 0, LockFlags.None);

Geometry.ComputeBoundingBox(graphicStream, this.preparedMesh.NumberVertices, this.preparedMesh.VertexBuffer.Description.VertexFormat, out this.lowerLeftCorner, out this.upperRightCorner);

this.preparedMesh.VertexBuffer.Unlock();
}

private bool DoPicking(int x, int y)
{
//You need to use the size of the back buffer which may not be the same as the window size (due to menu bars, borders etc.)
//The viewport structure holds the correct back buffer width and height
if (x < 0) x = 0;
if (y < 0) y = 0;
if (x > this.device.Viewport.Width) x = this.device.Viewport.Width;
if (y > this.device.Viewport.Height) y = this.device.Viewport.Height;

// Put mouse coordinates into screenspace Vector3's. These are the points
// defining our ray for picking, which we'll transform to object space
Vector3 rayPosition = new Vector3((float)x, (float)y, 0.0f);
Vector3 rayDirection = new Vector3((float)x, (float)y, 1.0f);

//premietne ray zo "screen space" do "object space" - ide o inverzne operacie k operaciam realizovanych maticami projection, view a world na objekte/objektoch v scene v takomto poradi
rayPosition.Unproject(this.device.Viewport, this.device.Transform.Projection, this.device.Transform.View, this.device.Transform.World);
rayDirection.Unproject(this.device.Viewport, this.device.Transform.Projection, this.device.Transform.View, this.device.Transform.World);
rayDirection.Subtract(rayPosition);

return (Geometry.BoxBoundProbe(this.lowerLeftCorner, this.upperRightCorner, rayPosition, rayDirection));
}

Prva z nich vytvori okolo objectu imaginarnu kocku tvoriacu hraniciacu oblast. Druha metoda testuje ci ray a tato imaginarna oblast maju priesecnik. Ak ano, mam vybrany objekt. Ale ako zisit o aku stranu kocky ide.
V Direct3D API je metoda v triede Mesh, ktora by mi pracu dost ulahcila, ale ja robim na PDA tak neviem, pls help ....
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail
Weny Sky



Založen: 28. 07. 2007
Příspěvky: 241

PříspěvekZaslal: 13. březen 2008, 20:20:11    Předmět: Odpovědět s citátem

A co tak si vyrendrovat pri kliknuti do nejakeho bufferu objekty kolem mista kde si kliknul(kvuli optimalizaci, aby se nerendrovala scena, kdyz te zajima jen okoli mysi), ktere chces mit oznacitlne, ruznymi barvami(stupni sedi, ...). A potom si na miste kam si kliknul mysi v tom bufferu prectes barvu toho pixelu a podle toho budes vedet na co si kliknul.

Takto nejak se delal picking napriklad v OpenGL, ale tam na to tusim jsou i nejake funkce. Kazdopadne princip jsem snad popsal Smile
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
KuboSVK



Založen: 13. 03. 2008
Příspěvky: 40

PříspěvekZaslal: 13. březen 2008, 23:47:24    Předmět: Odpovědět s citátem

Weny Sky napsal:
A co tak si vyrendrovat pri kliknuti do nejakeho bufferu objekty kolem mista kde si kliknul(kvuli optimalizaci, aby se nerendrovala scena, kdyz te zajima jen okoli mysi), ktere chces mit oznacitlne, ruznymi barvami(stupni sedi, ...). A potom si na miste kam si kliknul mysi v tom bufferu prectes barvu toho pixelu a podle toho budes vedet na co si kliknul.

Takto nejak se delal picking napriklad v OpenGL, ale tam na to tusim jsou i nejake funkce. Kazdopadne princip jsem snad popsal Smile


Ja mam na kazdej stene kocky texturu inej farby, idem to robit tak, ze kde kliknem stylusom, zistim farbu pixelu a viem o aku stenu kocky ide...
Takze ak som spravne pochopil co si vravel ty, tak to robim takisto Very Happy
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail
Zobrazit příspěvky z předchozích:   
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> 3D API / 3D Enginy Časy uváděny v GMT + 1 hodina
Strana 1 z 1

 
Přejdi na:  
Nemůžete odesílat nové téma do tohoto fóra
Nemůžete odpovídat na témata v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete hlasovat v tomto fóru


Powered by phpBB © 2001, 2005 phpBB Group


Vzhled udelal powermac
Styl "vykraden" z phpBB stylu MonkiDream - upraveno by rezna