Hi! Anybody here knows about an algorithm for quaternion that orients it to look to a given vector ? (eventually with the up vector too)
Something like:
lookAt( target, up:TVector):TQuaternion
Thanks
Hi! Anybody here knows about an algorithm for quaternion that orients it to look to a given vector ? (eventually with the up vector too)
Something like:
lookAt( target, up:TVector):TQuaternion
Thanks
If you save your data in a proprietary format, the owner of the format owns your data.
<br /><A href="http://msx80.blogspot.com">http://msx80.blogspot.com</A>
If no one gets a better idea and you?¢_Tre not too lazy you could snap matrix to quaternion conversion code onto gluLookAt.
Mesa?¢_~s gluLookAt looks likes this:
Code:void GLAPIENTRY gluLookAt(GLdouble eyex, GLdouble eyey, GLdouble eyez, GLdouble centerx, GLdouble centery, GLdouble centerz, GLdouble upx, GLdouble upy, GLdouble upz) { GLdouble m[16]; GLdouble x[3], y[3], z[3]; GLdouble mag; /* Make rotation matrix */ /* Z vector */ z[0] = eyex - centerx; z[1] = eyey - centery; z[2] = eyez - centerz; mag = sqrt(z[0] * z[0] + z[1] * z[1] + z[2] * z[2]); if (mag) { /* mpichler, 19950515 */ z[0] /= mag; z[1] /= mag; z[2] /= mag; } /* Y vector */ y[0] = upx; y[1] = upy; y[2] = upz; /* X vector = Y cross Z */ x[0] = y[1] * z[2] - y[2] * z[1]; x[1] = -y[0] * z[2] + y[2] * z[0]; x[2] = y[0] * z[1] - y[1] * z[0]; /* Recompute Y = Z cross X */ y[0] = z[1] * x[2] - z[2] * x[1]; y[1] = -z[0] * x[2] + z[2] * x[0]; y[2] = z[0] * x[1] - z[1] * x[0]; /* mpichler, 19950515 */ /* cross product gives area of parallelogram, which is < 1.0 for * non-perpendicular unit-length vectors; so normalize x, y here */ mag = sqrt(x[0] * x[0] + x[1] * x[1] + x[2] * x[2]); if (mag) { x[0] /= mag; x[1] /= mag; x[2] /= mag; } mag = sqrt(y[0] * y[0] + y[1] * y[1] + y[2] * y[2]); if (mag) { y[0] /= mag; y[1] /= mag; y[2] /= mag; } #define M(row,col) m[col*4+row] M(0, 0) = x[0]; M(0, 1) = x[1]; M(0, 2) = x[2]; M(0, 3) = 0.0; M(1, 0) = y[0]; M(1, 1) = y[1]; M(1, 2) = y[2]; M(1, 3) = 0.0; M(2, 0) = z[0]; M(2, 1) = z[1]; M(2, 2) = z[2]; M(2, 3) = 0.0; M(3, 0) = 0.0; M(3, 1) = 0.0; M(3, 2) = 0.0; M(3, 3) = 1.0; #undef M glMultMatrixd(m); /* Translate Eye to Origin */ glTranslated(-eyex, -eyey, -eyez); }
Sssh... if we give him the answer he might win the dog fight competition. :lol:
:lol: :lol:Originally Posted by Sly
Just becouse i ask about quaternions, that are expecially useful with airplane models, that doesn't mean it's about the dog fight compo..
Well, in this case, it is :mrgreen:
Btw my entry is going on greatly.. just wait and see
If you save your data in a proprietary format, the owner of the format owns your data.
<br /><A href="http://msx80.blogspot.com">http://msx80.blogspot.com</A>
Umm that could be an idea.. but i'm way too lazy Also i'm not that good with matrices and i could make some bug..Originally Posted by Paulius
If you save your data in a proprietary format, the owner of the format owns your data.
<br /><A href="http://msx80.blogspot.com">http://msx80.blogspot.com</A>
ok.. apart from jokes :mrgreen:
Any clue ? I need it quite a lot..
Thanks
If you save your data in a proprietary format, the owner of the format owns your data.
<br /><A href="http://msx80.blogspot.com">http://msx80.blogspot.com</A>
Nicola,
If you are using JEDI-SDL, in the OpenGL directory you should find Mike Lischke's excellent Geometry.pas file which has all sorts of 3D functions including Quaternions.
IHTH.
I've already looked there, but there is not a big support for quaternions. There are only basic functions.Originally Posted by savage
I'm assembling a unit that is more complete, so btw if you want to use it on JEDI-SDL just ask. It's based on FastGEO for vectors and the like (but it can easily be changed)
If you save your data in a proprietary format, the owner of the format owns your data.
<br /><A href="http://msx80.blogspot.com">http://msx80.blogspot.com</A>
I've spotted this article.
It tells something about how to obtain axis angle representation of the rotation of a given vector to another. It doesn't uses the up vector, but it can still be useful..
I tryed and implemented this:
[pascal]
v:=mul(a.position, b.position); // cross product
b.orientation.x:=v.x;
b.orientation.y:=v.y;
b.orientation.z:=v.z;
b.orientation.w:= magnitude(a.position) * magnitude(b.position) + dotproduct( unitvector(b.position), unitvector(a.position));
Q_normed(b.orientation);
[/pascal]
It should orient b to a but it doesn't work..
Anyone interested in helping ?
Thanks
If you save your data in a proprietary format, the owner of the format owns your data.
<br /><A href="http://msx80.blogspot.com">http://msx80.blogspot.com</A>
Bookmarks