Rotate local xyz around global position (help)
Blitz3D Forums/Blitz3D Programming/Rotate local xyz around global position (help)
| ||
| Hi all, I'm in URGENT need of some mathematical assistance... I've got a GLOBAL position XYZ and a GLOBAL rotation PYR. Then I have 3 LOCAL coordinates (ABC) that act as a 'local offset'. My Question is: How do I transform those 3 local coordinates ABC around the global coordinates XYZ using the global rotation PYR and obtain those new coordinates? I basically need what TFormPoint() does. But since I have to do this 'outside of blitz' (in visual basic) I can't use tFormPoint - or any other Blitz3D commands :(( Any help would be a total life safer! ;) Thanks in advance, Danny. |
| ||
| Ok I got this far - which seems to be good except for some reason my X-coordinate result is not ACCURATE! There's a mistake somewhere... Does anyone know what I've done wrong here: (I'm sure some of you are laughing out loud ;)pp )
;I want to rotate the 'local offset' around the global coordinate - by using the global rotation angles.
Graphics3D 800,600,0,2
Cls
Color 255,255,255
;original GLOBAL COORDINATE
ox# = -239.475
oy# = 2.07104
oz# = -81.7197
;original GLOBAL ROTATION
xr# = 9.06404
yr# = -145.508
zr# = 0.00
;original LOCAL OFFSET
offx# = 0.0
offy# = 0.1
offz# = 0.1
;Transformation using TFormPoint()
tmp = CreatePivot()
PositionEntity tmp, ox,oy,oz, 1 ; global pos
RotateEntity tmp, xr,yr,zr, 1 ; global rot
TFormPoint offx,offy,offz, tmp, 0 ; local offset to world coords
ok1x# = TFormedX()
ok1y# = TFormedY()
ok1z# = TFormedZ()
Color 160,160,160
Print "Original coordinate: "+ox+", "+oy+", "+oz
Print ""
Color 255,255,255
Print "TFormed coordintes : "+ok1x+", "+ok1y+", "+ok1z+" = what I NEED!"
Print ""
; ROTATE THE LOCAL OFFSET around GLOBAL ANGLE (attempt)
x# = offx#
y# = offy#
z# = offz#
;rotate offset around X axis
newy# = y# * Cos#(xr#) - z# * Sin#(xr#)
newz# = y# * Sin#(xr#) + z# * Cos#(xr#)
y# = newy#
z# = newz#
;rotate offset around Y axis
newx# = z# * Sin#(yr#) + x# * Cos#(yr#)
newz# = z# * Cos#(yr#) - x# * Sin#(yr#)
x# = newx#
z# = newz#
;rotate offset around Z axis
newx# = x# * Cos#(zr#) - y# * Sin#(zr#)
newy# = x# * Sin#(zr#) + y# * Cos#(zr#)
x# = newx#
y# = newy#
;add global coordinates to rotated offset
x# = x# + ox#
y# = y# + oy#
z# = z# + oz#
Print "transformed coords : "+x+", "+y+", "+z+" = what I GOT :("
Print ""
Color 255,50,50
Print "INACCURACY (xyz) : "+(ok1x-x)+", "+(ok1y-y)+", "+(ok1z-z)
Print ""
Print ""
WaitKey()
EndThanks, Danny |
| ||
| Nobody? :( It's supposed to be a simple '3d rotation' but for some reason my x result is not perfecly accurate, whilst the rest does seem to be ok. ?! |
| ||
| I think the y rotations are inverted so you need to use a neg y angle in your calcs :- note the -yr ;rotate offset around Y axis newx# = z# * Sin#(-yr#) + x# * Cos#(-yr#) newz# = z# * Cos#(-yr#) - x# * Sin#(-yr#) x# = newx# z# = newz# |
| ||
| Oh, and you need to do the rotations in this order :- z,x,y ;rotate offset around Z axis newx# = x# * Cos#(zr#) - y# * Sin#(zr#) newy# = x# * Sin#(zr#) + y# * Cos#(zr#) x# = newx# y# = newy# ;rotate offset around X axis newy# = y# * Cos#(xr#) - z# * Sin#(xr#) newz# = y# * Sin#(xr#) + z# * Cos#(xr#) y# = newy# z# = newz# ;rotate offset around Y axis newx# = z# * Sin#(-yr#) + x# * Cos#(-yr#) newz# = z# * Cos#(-yr#) - x# * Sin#(-yr#) x# = newx# z# = newz# |
| ||
| THANKS A MILLION Brendane!!!! I could kiss you!! :) (no worries, straight as an arrow!) Yes your first comment already fixed 99% of the situation. I found out that in extreme (roll) angles there is still a tiny inaccuracy that's bugging me, but i'll try your last comment and keep me fingers crossed!!! Thanks again mate! I owe you! d. |
| ||
| Badabing! badaboom! (little victory dance going on here..) Yep - switching the rotation order fixed it completely!! Thanks again and again man! Danny |
| ||
| Err, yeah, did you see the football last night? No worries. I did spot the slight floating point inaccuracies, but that's because of the way the transform is calculated internally, either through a matrix or a quat transform - these innacuracies will creep in. Your alternative is to try to emulate the process using Mark's geometry code as closely as possible. If the error is small enough for you to not worry about it's probably not worth it. From what I've seen it's usually much less than 0.001 Good luck! |
| ||
| Everything seems to be working super fine (now), the routine is actually done in visual basic to convert Blitz based camera data to Maya via MEL scripts. VB spits out floats with 12 digits after the decimal point, so I'm not too worried about accuracy ;) When I render a still in maya and overlay it with the blitz version in photoshop it's practially pixel perfect. Even with extreme lenses and angles it all matches nicely... Cheers, Danny. |