KuboSVK
Založen: 13. 03. 2008 Příspěvky: 40
|
Zaslal: 13. březen 2008, 17:09:26 Předmět: Direct3D Mobile - picking objects |
|
|
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 .... |
|
Weny Sky
Založen: 28. 07. 2007 Příspěvky: 241
|
Zaslal: 13. březen 2008, 20:20:11 Předmět: |
|
|
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 |
|
KuboSVK
Založen: 13. 03. 2008 Příspěvky: 40
|
Zaslal: 13. březen 2008, 23:47:24 Předmět: |
|
|
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 |
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 |
|