Mathe 3D... Rotation zur?ckrechnen!?

Previous topic - Next topic

blastar

hi@all,
ich arbeite rein auf softwarebasis also ohne die 3d-unterst?tzung von GLB - und jetzt habe ich da ein kleines(?) problem.

mein 3d-'welt' f?hrt eine etwas umst?ndliche rotation (ohne translation) aus mit verschiedenen gr??en die da einfluss haben. jetzt wollte ich allerdings nicht jedesmal die welt mehrere mal mitdrehen (aus performancegr?nden) sondern dachte einfach zwei dummy-punkte [100,0,0] & [0,100,0] zu drehen aus denen ich dann die vollst?ndige rotation r?ckrechnen kann um diese dann auf meine 'welt' anzuwenden...
aber ich bekomme es einfach nicht hin!!!! :giveup:
hat jemand eine idee oder gar eine l?sung?

Schranz0r

versteh ich net....
Benutzt du ne 12er Matrix ?
I <3 DGArray's :D

PC:
AMD Ryzen 7 3800X 16@4.5GHz, 16GB Corsair Vengeance LPX DDR4-3200 RAM, ASUS Dual GeForce RTX™ 3060 OC Edition 12GB GDDR6, Windows 11 Pro 64Bit, MSi Tomahawk B350 Mainboard

blastar

sorry, aber das mir den matrizen habe ich noch nie so richtig verstanden und mogel mich da trotzdem ganz gut durch... irgendwie... ! :(
ich denke die beschreibung 'orbit-camera' kommt dem am n?chsten was ich suche... allerdings OHNE das '?berschnappen' der winkel, so dass man beispielsweise die camera einmal um das object kreisen lassen kann... hat jemand 'ne idee?

Schranz0r

die Cam bei 0,0,0 lassen und alles um die Cam drehen :)
I <3 DGArray's :D

PC:
AMD Ryzen 7 3800X 16@4.5GHz, 16GB Corsair Vengeance LPX DDR4-3200 RAM, ASUS Dual GeForce RTX™ 3060 OC Edition 12GB GDDR6, Windows 11 Pro 64Bit, MSi Tomahawk B350 Mainboard

blastar

Quoteohne die 3d-unterst?tzung von GLB!
ich brauche die genaue rechenweise bzw die formeln dazu!  :'(

Schranz0r

SIN COS ;)

2 Winkel einer XZ einer YZ :P

Selbst ist der Mann :)

Wenn du garnet zurande kommst dann helf ich dir ^^
I <3 DGArray's :D

PC:
AMD Ryzen 7 3800X 16@4.5GHz, 16GB Corsair Vengeance LPX DDR4-3200 RAM, ASUS Dual GeForce RTX™ 3060 OC Edition 12GB GDDR6, Windows 11 Pro 64Bit, MSi Tomahawk B350 Mainboard

blastar

#6
SIN & COS sind schon klar aber ich bekomme es einfach nicht hin... sitze wohl schon zulange an dem 'problem' (zumind f?r mich zZ) crooked
ich habe mal einen kleinen CODE angeh?ngt der das ganze etwas sichtbar machen soll: es geht um eine 'panzersteuerung' (keine ahnung wie man das sonst nennt), mit mit [rechts][links] dreht man die sphere... da ich zb hier probleme habe die rotation nachzurechnen muss ich die vertics der sphere IMMER mitdrehen und das ergebnis speichern... ich habe mal meinen code soweit eingek?rzt (nicht lachen!) dass ich das 'problem' sichtbar machen kann... dazu dachte ich nur zwei punkte zu drehen, einen f?r X & Y, den zweiten f?r die bestimmung der Rotation!

da f?llt auf das XZ & YZ nicht reichen! :|

Schranz0r, w?re super wenn du mir da helfen kannst die genaue rotation der sphere zur?ckzurechnen!

Code (glbasic) Select

GLOBAL VERZERRUNG = 1000; ABSTAND = 5
GLOBAL ROTX = 0; ROTZ = 0
GLOBAL Sphere_VERT = 42; Sphere_POLY = 80
GLOBAL OUTX, OUTY, OUTZ
GLOBAL COSX, SINX, COSY, SINY, COSZ, SINZ

TYPE tSphere
VERT[42][3]
VERTX[42][3]
POLY[80][3]
ENDTYPE
GLOBAL SphereList[] AS tSphere

PUNKT1_X = 0
PUNKT1_Y = 1
PUNKT1_Z = 0

PUNKT2_X = 1
PUNKT2_Y = 0
PUNKT2_Z = 0

//-------------------------------------

SETSCREEN 640, 480, 0
LIMITFPS 60

Add_Sphere()

WHILE KEY(1) = 0

ROTX = 0
ROTZ = 0

IF KEY(200) THEN ROTX = 3
// IF KEY(208) THEN ROTX = - 3
IF KEY(203) THEN ROTZ = 3
IF KEY(205) THEN ROTZ = - 3

Calc_Sphere(ROTX, ROTZ)
Draw_Sphere()

//---------------------------------
// zum sichtbarmachen der punkte
//---------------------------------

COSX = COS(ROTX)
SINX = SIN(ROTX)
COSY = COS(0)
SINY = SIN(0)
COSZ = COS(ROTZ)
SINZ = SIN(ROTZ)

ROTATE(PUNKT1_X, PUNKT1_Y, PUNKT1_Z, COSX, SINX, COSY, SINY, COSZ, SINZ)
PUNKT1_X = OUTX
PUNKT1_Y = OUTY
PUNKT1_Z = OUTZ
OUTY = OUTY * -1
OUTZ = OUTZ * -1
OUTX = OUTX * VERZERRUNG / (OUTZ + ABSTAND) + 320
OUTY = OUTY * VERZERRUNG / (OUTZ + ABSTAND) + 240
DRAWLINE 320, 240, OUTX, OUTY, RGB(255, 0 , 0)
PRINT "Punkt 1", OUTX, OUTY

DRAWRECT 0, 0, 170, 40, RGB(255,0,0)
PRINT "X: " + PUNKT1_X, 5, 8
PRINT "Y: " + PUNKT1_Y, 5, 16
PRINT "Z: " + PUNKT1_Z, 5, 24

ROTATE(PUNKT2_X, PUNKT2_Y, PUNKT2_Z, COSX, SINX, COSY, SINY, COSZ, SINZ)
PUNKT2_X = OUTX
PUNKT2_Y = OUTY
PUNKT2_Z = OUTZ
OUTY = OUTY * -1
OUTZ = OUTZ * -1
OUTX = OUTX * VERZERRUNG / (OUTZ + ABSTAND) + 320
OUTY = OUTY * VERZERRUNG / (OUTZ + ABSTAND) + 240
DRAWLINE 320, 240, OUTX, OUTY, RGB(0, 255, 0)
PRINT "Punkt 2", OUTX, OUTY

DRAWRECT 0, 50, 170, 40, RGB(0, 255, 0)
PRINT "X: " + PUNKT2_X, 5, 58
PRINT "Y: " + PUNKT2_Y, 5, 66
PRINT "Z: " + PUNKT2_Z, 5, 74

//---------------------------------
//---------------------------------

SHOWSCREEN

WEND
END

//-------------------------------------

FUNCTION Add_Sphere:

LOCAL b AS tSphere

RESTORE Sphere_Vertics
FOR x = 0 TO Sphere_VERT - 1
READ a1
READ a2
READ a3
b.VERT[x][0] = a1
b.VERT[x][1] = a2
b.VERT[x][2] = a3
NEXT

RESTORE Sphere_faces
FOR x = 0 TO Sphere_POLY - 1
READ a1
READ a2
READ a3
b.POLY[x][0] = a1
b.POLY[x][1] = a2
b.POLY[x][2] = a3
NEXT
DIMPUSH SphereList[], b

ENDFUNCTION
FUNCTION Calc_Sphere: rx, rz

LOCAL b AS tSphere
FOREACH b IN SphereList[]

COSX = COS(rx)
SINX = SIN(rx)
COSY = COS(0)
SINY = SIN(0)
COSZ = COS(rz)
SINZ = SIN(rz)

FOR x = 0 TO Sphere_VERT - 1
ROTATE(b.VERT[x][0], b.VERT[x][1], b.VERT[x][2], COSX, SINX, COSY, SINY, COSZ, SINZ)
b.VERT[x][0] = OUTX
b.VERT[x][1] = OUTY
b.VERT[x][2] = OUTZ
OUTY = OUTY * -1
OUTZ = OUTZ * -1
b.VERTX[x][0] = OUTX * VERZERRUNG / (OUTZ + ABSTAND) + 320 // trans
b.VERTX[x][1] = OUTY * VERZERRUNG / (OUTZ + ABSTAND) + 240 //
b.VERTX[x][2] = OUTZ
NEXT
NEXT

ENDFUNCTION
FUNCTION Draw_Sphere:

LOCAL test
LOCAL t1, t2, t3
LOCAL rx1, ry1, rz1
LOCAL rx2, ry2, rz2
LOCAL rx3, ry3, rz3

LOCAL b AS tSphere
FOREACH b IN SphereList[]

FOR x = 0 TO Sphere_POLY - 1

t1 = b.POLY[x][0]
t2 = b.POLY[x][1]
t3 = b.POLY[x][2]

rx1 = b.VERTX[t1][0]
ry1 = b.VERTX[t1][1]
// rz1 = b.QUADX[t1][2]

rx2 = b.VERTX[t2][0]
ry2 = b.VERTX[t2][1]
// rz2 = b.QUADX[t2][2]

rx3 = b.VERTX[t3][0]
ry3 = b.VERTX[t3][1]
// rz3 = b.QUADX[t3][2]

color = RGB(64, 64, 64) // Backface culling
test = (rx2 - rx1) * (ry3 - ry1) - (ry2 - ry1) * (rx3 - rx1) //
IF test <= 0 //
color = RGB(255, 255, 255) //
ENDIF //
DRAWLINE rx1 , ry1, rx2, ry2, color
DRAWLINE rx2 , ry2, rx3, ry3, color
DRAWLINE rx3 , ry3, rx1, ry1, color

NEXT
NEXT

ENDFUNCTION

FUNCTION ROTATE: x, y, z, wcx, wsx, wcy, wsy, wcz, wsz

rxt = x
ryt = y
rzt = z
rx2t = rxt
ry2t = ryt
rz2t = rzt
rx2t = rxt * wcz - ryt * wsz
ry2t = rxt * wsz + ryt * wcz
rxt = rx2t
ryt = ry2t
rzt = rz2t
rx2t =  rxt * wcy + rzt * wsy
rz2t = -rxt * wsy + rzt * wcy
rxt = rx2t
ryt = ry2t
rzt = rz2t
ry2t = ryt * wcx - rzt * wsx
rz2t = ryt * wsx + rzt * wcx

OUTX = rx2t
OUTY = ry2t
OUTZ = rz2t

ENDFUNCTION

STARTDATA Sphere_Vertics:
DATA -0.850651, 0.276393, -0.447214, -1.000000, 0.000000, 0.000000
DATA -0.850651, -0.276393, 0.447214, -0.809017, -0.262866, -0.525731
DATA -0.809017, 0.587785, 0.000000, -0.809017, -0.587785, 0.000000
DATA -0.809017, 0.262866, 0.525731, -0.525731, -0.723607, -0.447214
DATA -0.525731, 0.723607, 0.447214, -0.500000, 0.162460, -0.850651
DATA -0.500000, 0.688191, -0.525731, -0.500000, -0.688191, 0.525731
DATA -0.500000, -0.162460, 0.850651, -0.309017, -0.425325, -0.850651
DATA -0.309017, 0.951057, 0.000000, -0.309017, -0.951057, 0.000000
DATA -0.309017, 0.425325, 0.850651, 0.000000, 0.000000, -1.000000
DATA 0.000000, 0.525731, -0.850651, 0.000000, 0.894427, -0.447214
DATA -0.000000, -0.850651, -0.525731, 0.000000, 0.850651, 0.525731
DATA -0.000000, -0.894427, 0.447214, -0.000000, -0.525731, 0.850651
DATA 0.000000, 0.000000, 1.000000, 0.309017, -0.425325, -0.850651
DATA 0.309017, 0.951057, 0.000000, 0.309017, -0.951057, 0.000000
DATA 0.309017, 0.425325, 0.850651, 0.500000, 0.162460, -0.850651
DATA 0.500000, 0.688191, -0.525731, 0.500000, -0.688191, 0.525731
DATA 0.500000, -0.162460, 0.850651, 0.525731, -0.723607, -0.447214
DATA 0.525731, 0.723607, 0.447214, 0.809017, -0.262866, -0.525731
DATA 0.809017, 0.587785, 0.000000, 0.809017, -0.587785, 0.000000
DATA 0.809017, 0.262866, 0.525731, 0.850651, 0.276393, -0.447214
DATA 1.000000, -0.000000, 0.000000, 0.850651, -0.276393, 0.447214
ENDDATA

STARTDATA Sphere_faces:
DATA 0, 3, 1
DATA 0, 9, 3
DATA 0, 10, 9
DATA 1, 4, 0
DATA 1, 5, 2
DATA 1, 6, 4
DATA 2, 6, 1
DATA 2, 12, 6
DATA 3, 5, 1
DATA 3, 7, 5
DATA 3, 13, 7
DATA 4, 10, 0
DATA 4, 14, 10
DATA 5, 11, 2
DATA 5, 15, 11
DATA 6, 8, 4
DATA 6, 16, 8
DATA 7, 15, 5
DATA 7, 20, 15
DATA 8, 14, 4
DATA 8, 21, 14
DATA 9, 13, 3
DATA 9, 17, 13
DATA 9, 18, 17
DATA 10, 18, 9
DATA 10, 19, 18
DATA 11, 12, 2
DATA 11, 23, 12
DATA 12, 16, 6
DATA 12, 24, 16
DATA 13, 20, 7
DATA 13, 25, 20
DATA 14, 19, 10
DATA 14, 26, 19
DATA 15, 22, 11
DATA 15, 27, 22
DATA 16, 21, 8
DATA 16, 28, 21
DATA 17, 25, 13
DATA 17, 29, 25
DATA 18, 29, 17
DATA 18, 30, 29
DATA 19, 30, 18
DATA 20, 27, 15
DATA 20, 33, 27
DATA 21, 26, 14
DATA 21, 34, 26
DATA 22, 23, 11
DATA 22, 31, 23
DATA 23, 24, 12
DATA 23, 32, 24
DATA 24, 28, 16
DATA 24, 32, 28
DATA 25, 33, 20
DATA 25, 35, 33
DATA 26, 30, 19
DATA 26, 36, 30
DATA 27, 31, 22
DATA 27, 37, 31
DATA 28, 34, 21
DATA 28, 38, 34
DATA 29, 35, 25
DATA 29, 39, 35
DATA 30, 39, 29
DATA 31, 32, 23
DATA 31, 41, 32
DATA 32, 38, 28
DATA 32, 41, 38
DATA 33, 37, 27
DATA 34, 36, 26
DATA 34, 38, 36
DATA 35, 37, 33
DATA 35, 40, 37
DATA 36, 39, 30
DATA 36, 40, 39
DATA 37, 41, 31
DATA 38, 40, 36
DATA 38, 41, 40
DATA 39, 40, 35
DATA 40, 41, 37
ENDDATA

blastar

#7
kleiner zwischenstand:

habe jetzt sogar mit drei punkten (obwohl zwei rechen sollten) gearbeitet:
- mit punkt#1 X-rotation ausgerechnet und alle drei punkte zur?ckrotiert
- mit punkt#2 Y-rotation ausgerechnet und wieder alle drei punkte zur?ckrotiert
- mit punkt#3 Z-rotation ausgerechnet und wieder alle drei punkte zur?ckrotiert
- kontrolle: alles wieder auf 0... winkel sind logisch... soweit gut...

ABER
an gewissen punkten schnappen die winkel einfach ?ber... ist wohl abh?ngig vom quadranten...  :'( HHHHIIIIIIIIIIIIIILLLLLLLLLLLLFFFFFFFEEEEEEEEE! :giveup:

Kitty Hello

puh. Bin auch ?berfragt.
Du willst etwas wieder zur?ckdrehen? Ich mach immer eine Matrix und die inveritere ich dann. Wenn ich p' * M[] = p mache, erhalte ich wieder den zur?ckgedrehten Punkt.

blastar

#9
Quote from: Kitty Hello on 2009-Jul-20puh. Bin auch ?berfragt.

irgendwie ist das genau die anwort die ich ?berall gefunden habe... 'ne richtige l?sung auf formelbasis habe ich nicht gefunden...  :'(

Da GLB leider nicht in der Lage ist 3d als Wireframe darstellen (warum eigentlich?) oder eine m?glichkeit bietet die vertics der (fertigen) objekte/szene auszulesen um diese dann selbst als wireframe darzustellen will bzw. muss ich alles selber machen... und da scheitere ich nun an diesem problem!

das ganze in einer ebene zu machen (wie ein normaler 3d-shooter / fps) ist kein problem aber dann dann in drei ebenen... da wird es sehr komplex! :'(

alternativ w?re aber auch eine l?sung hilfreicht die mir sagt wie ich diese form der 3d-bewegung (steuerung) mitz?hle...

Tenorm

Quote from: blastar on 2009-Jul-20
Quote from: Kitty Hello on 2009-Jul-20puh. Bin auch ?berfragt.

Da GLB leider nicht in der Lage ist 3d als Wireframe darstellen (warum eigentlich?) oder eine m?glichkeit bietet die vertics der (fertigen) objekte/szene auszulesen um diese dann selbst als wireframe darzustellen []

?? Geht doch: "X_GETFACE" und dann die faces mit x_line zeichnen
is zwar langsam aber zum debuggen taugts  :whistle: