Frage zu X_SCRREN2WORLD, X_COLLISIONRAY und X_GETFACE

Previous topic - Next topic

Det

Und heute mal wieder eine Frage auf deutsch (hab mich noch nicht entschieden, ob es sich lohnt auf englisch zu posten...)

Ich habe ein Testszenario aufgebaut, um eine Kollision mit meinem 3D-Objekt zu erproben.

Ziel: Koordinatenpaar des Objekts unter der Mausposition auf der UV-Map der Textur finden.

Versuchsanordnung: 3DObjekt mit Blender erstellt -als obj exportiert zu ddd konvertiert.
Eingelesen
Zeigt 1a Ergebnis. Objekt positioniert im Ursprung (denke ich), Kamera auf der x-Achse mit entfernung 15.

Was ich bisher verstanden habe: Collisionray gibt eine Distanz oder 0 zurück. Offenbar gebe ich 2 Punkte rein. Als Quellpunkt gebe ich meine Kamera vor. Zweiter Punkt wird meine Maus, aber von Screen auf Weltkoordinaten umgerechnet.

Ergebnis ist so lala: Auf einem Kreis um die Bildschirmmitte (wo ja nun auch mein Objekt liegt) bekomme ich Kollisionen. Aber: Der Kreis ist deutlich kleiner als mein Objekt...

Denkbare Probleme: Meine Screen2World-Transformation ist müll. Kann gut sein, da die Z-Angabe "geraten" ist (1):
Frage: Was gebe ich da sinnvollerweise an?

Nächstes Problem: Wenn ich mich mal das Problem der fehlenden Treffer ignoriere: Ich bekomme eine Face-Id. Prima. Aber ehrlich gesagt raffe ich den Aufbau des face-Arrays nicht. Nicht weil es ein 2Dimensionales Array ist, sondern die Unterteilung in nodes verstehe ich nicht. Also: Das Face besteht (weil ich es aus Dreiecken aufgebaut habe) aus 3 Kanten. Wieso hat eine Kante eine tx,ty-Koordinate in die Textur (Wenn ich die Doku richtig lese, z.b. tx=[0][3])? Als Werte bekomme ich so etwas:
Tx: 0.6175429821 ty:0.3996520042
Ich hatte mit etwas "direkterem" gerechnet, wie transformiere ich das zurück in meine Textur-Map?


Samplecode:
Code (glbasic) Select

LOADSPRITE "Media/WorldTexture.jpg", 0
X_LOADOBJ "Media/MyWorldResized.ddd", 0
LOCAL mx,my,b1,b2
LOCAL col
LOCAL cx,cy,cz
LOCAL faceIdx, face[]

SYSTEMPOINTER 1

WHILE TRUE
MOUSESTATE mx,my,b1,b2
X_SCREEN2WORLD mx, my, 1, cx,cy,cz

col = X_COLLISIONRAY(0, 0, 15,0,0, cx,cy,cz)
IF (col<>0)
DEBUG ("Coll det" + col + ".."+ "\n")
faceIdx=X_GETCOLLISIONFACE()
X_GETFACE 0,0,faceIdx,face[]
DEBUG ("Tx: " + face[0][3] + " ty:" + face[0][4] + "\n");
ELSE
DEBUG ("NO Coll det " + "\n")
ENDIF

X_MAKE3D 1, 50, 45
X_CAMERA 15,0,0,0,0,0
X_SETTEXTURE 0, -1

X_ROTATION 0,0,1,0
X_ROTATION 0,0,0,1
X_DRAWAXES 10,10,10
X_DRAWOBJ 0,0
SHOWSCREEN
WEND



Das sind jetzt leider einige Fragen in einem Thread, aber da die alle zusammenhängen passt das vielleicht...

Mir fehlt jetzt so'n bisschen die Idee wie ich weiterkomme, und ich freu' mich über jede Anmerkung

TIA
Det
Adopt, adapt and improve

Kitty Hello

Ich meine x_collisinray liefert einen Wert der ein Faktor zur Strecke ist. Du solltest also den Richtungsvektor normieren (=länge=1.0) machen um den Absoluten Abstand zu bekommen.
Beispiel xcolray ...1,1,1 , 2,1,1...

Kitty Hello

Und mach mit dem mauskoordinaten 2x screen2world. Einmal z=0 und einmal z=1. 

Det

Hmm. Nee hat nix gebracht. Die distanz zum Object ist mir jetzt erstmal egal, mir reicht 0 oder !0
zweimal Screen2world hat das ergebnis nicht verbessert:
ich nehme an, du meinst so:
   X_SCREEN2WORLD mx, my,0, msx,msy,msz
   X_SCREEN2WORLD mx, my,1, cx,cy,cz
   col = X_COLLISIONRAY(0, 0, cx,cy,cz, msx,msy,msz)
Damit wird der "Trefferkreis" eher kleiner :(

Konntest Du das Problem verifizieren, oder soll ich noch meine Ressourcen dazupacken?
Adopt, adapt and improve

Det

komischer und komischer, sagte alice...

dieser code:

Code (glbasic) Select
LOADSPRITE "Media/WorldTexture.jpg", 0
X_LOADOBJ "Media/MyWorldTri.ddd", 0

LOCAL col

SYSTEMPOINTER 1

WHILE TRUE


X_MAKE3D 1, 50, 45
X_CAMERA 25,15,25,0,0,0

X_LINE 0,0,0,30,10,30, 3,RGB(255,0,255)
col = X_COLLISIONRAY (0,0,30,10,30,0,0,0)
DEBUG "Col: " + col
X_DRAWAXES 0,0,0
X_SETTEXTURE 0, -1
X_DRAWOBJ 0,0
SHOWSCREEN
WEND


Nur feste Werte, nix aufregendes. Und doch: In der debug-Ausgabe ist "Col: 0" . Hrmpf. Also Screen2World / Maus und sonstiges spielen nicht mit. Aber die Col sollte doch wohl !=0 sein?

(Anbei ein Screenshot)

Ich bin jetzt erstmal ratlos..

BTW: Wenn ich meine Line nicht zeichne, finde ich trotz "Debug mode" die versprochene rote linie nicht. Das würde ja zur "Col=0" passen, allein: Wo ist sie denn dann?

Benutzt X_COLLISIONRAY keine 2PunkteForm um die Linie zu zeichnen?


Adopt, adapt and improve

Kitty Hello

Was liefert xcolray 30,30,30 nach 0,0,0?

Kitty Hello

Oder... War nicht eins der startpunkt und das andere die Richtung (statt 2.Punkt)...