Skip to main content

Plane-Like rotating...

Alsalam alikom wa ra7mat allah wa barakatoh

Here is some explaination about how to rotate the camera just like the plane rotates...

We have Up Vector and a View Vector, to make the camera rotates right, we rotate the view vector about 0,1,0 vector with the angle we wish...

RotateView(-0.1f, 0, 1, 0);

RotateView will just calculate the new viewVector after multiplying it by the 3D Rotation matrix...

This is just regular,

Now how to make the the camera (the plane) rotates, we will simply rotate the upVector around the view vector but here will arise a problem that when we continue rotating right, the upVector will just miss the whole thing... mm try to imagine it.. we rotated it about a vector (view) then this view vector changed its direction, then we continue rotating it about the new view... blah blah.. just a total miss..

Actually, I don't know the professional way to solve it, but i got two good ideas (in my opinion), first one is whenever we rotate the view, we rotate the upVector about 0,1,0 with the same angle we rotated the view with... this will keep the upVector always perpendicular to the view vector and just looking rotated..
Second one is whenever we rotate the viewVector, we reset the upVector to 0,1,0 then rotate it with the total angle... instead of stepping each time 0.1 or whatever....

Both solutions r similar.. i'm attaching the code of the first one..


void CCamera::RotateView(float angle, float x, float y, float z)
{
CVector3 vNewView;
CVector3 vView = m_vView - m_vPosition;
float cosTheta = (float)cos(angle);
float sinTheta = (float)sin(angle);
vNewView.x = (cosTheta + (1 - cosTheta) * x * x) * vView.x;
vNewView.x += ((1 - cosTheta) * x * y - z * sinTheta) * vView.y;
vNewView.x += ((1 - cosTheta) * x * z + y * sinTheta) * vView.z;

vNewView.y = ((1 - cosTheta) * x * y + z * sinTheta) * vView.x;
vNewView.y += (cosTheta + (1 - cosTheta) * y * y) * vView.y;
vNewView.y += ((1 - cosTheta) * y * z - x * sinTheta) * vView.z;

vNewView.z = ((1 - cosTheta) * x * z - y * sinTheta) * vView.x;
vNewView.z += ((1 - cosTheta) * y * z + x * sinTheta) * vView.y;
vNewView.z += (cosTheta + (1 - cosTheta) * z * z) * vView.z;

m_vView = m_vPosition + vNewView;

// This part will rotate the upVector about 0,1,0 with the same rotation angle of the viewVector
RotateUp(angle, 0, 1, 0);
}
void CCamera::RotateUp(float angle, float x, float y, float z)
{
CVector3 vNewView;
CVector3 vUp = m_vUpVector;
float cosTheta = (float)cos(angle);
float sinTheta = (float)sin(angle);

vNewView.x = (cosTheta + (1 - cosTheta) * x * x) * vUp.x;
vNewView.x += ((1 - cosTheta) * x * y - z * sinTheta) * vUp.y;
vNewView.x += ((1 - cosTheta) * x * z + y * sinTheta) * vUp.z;

vNewView.y = ((1 - cosTheta) * x * y + z * sinTheta) * vUp.x;
vNewView.y += (cosTheta + (1 - cosTheta) * y * y) * vUp.y;
vNewView.y += ((1 - cosTheta) * y * z - x * sinTheta) * vUp.z;

vNewView.z = ((1 - cosTheta) * x * z - y * sinTheta) * vUp.x;
vNewView.z += ((1 - cosTheta) * y * z + x * sinTheta) * vUp.y;
vNewView.z += (cosTheta + (1 - cosTheta) * z * z) * vUp.z;

m_vUpVector = vNewView;
}

* Note : the code of multiplying with the matrix is not mine, i copied it (as it's) from GameTutorials

- Now, u can simply call (in ur VK_RIGHT) something like this

RotateView(-0.1f, 0, 1, 0);
CVector3 vAxis = m_vView - m_vPosition;
vAxis = Normalize(vAxis);
RotateUp(0.1f, vAxis.x, vAxis.y, vAxis.z);

This will give u the desidered effect, of course u can play with -0.1f and 0.1f values to make it looks better, or make it depend on ur straight-forward speed... but this is another story :)...

Hope u (me :D) enjoy it..

Alsalam alikom wa ra7mat allah wa barakatoh

Comments

Popular posts from this blog

Exploiting Double Free Vulnerabilities...

Alsalam alikom wa ra7mat Allah wa barakatoh



Huh!! that's what I said when I first saw that title... but let me explain...


Double Free means that you try to free a pointer two times (which is logically can't work).
Actually windows SP2 and later (even Vista) this can be done (in somehow) and can actually corrupt the heap (Vista will shout at your face if u did) and that can make you able to use and browse the heap as you want..

Facts to know about how Windows frees your pointers:
- There is something called Lookaside buffer (fast access, small size) and another thing is FreeList(slower access, the whole memory).
- Chunk is an object of the DataStructure that holds mainly 2 things: pointer to where the next free Chunk is and pointer to the previous free one (think about it like a node in a linked list)
- The first 4 bytes of the Chunk is the BLink (BackLink) and the second 4 bytes is the FLink
- delete ptr1;
delete ptr2;
Windows takes your Chunk (for ptr1) and puts it in the Lookaside s…

Windows7 adds Math Input Panel

Alsalam alikom wa ra7mat Allah wa barakatoh…I was reading a windows team post about Input Panels improvements in Windows7 [here]. When at the end I saw a very interesting –intuitive if you wish- new thing… which is, as you guessed, the Math Input Panel…Yes, that crappy font is mine… I “drew” that by mouse as I don’t have a tablet pen/pc.You can then paste it directly into word and it’ll recognize it as an editable equation…During my tests, the output panel (the top part) hanged, but I liked that the drawing panel was still responsive and I could still write/erase… till the top one started to respond again…One other thing to know, after you click Insert (that button down there) it copies the equation in MathML [Wikipedia link] format.. which is a standard way of representing equations and hence any application that recognizes the format can insert it not as an image but as a nice editable equation…If you think it recognized something wrong, you can click “Select and Correct” then draw …

Visual Studio 2008 Not saving changes or project properties?

Alsalam alikom wa ra7mat Allah wa barakatoh (Peace upon you)I’ve recently ran into problems with VS 2008. Summarized here:When you try to edit the project properties (specially C++ projects) you are faced with a little nice message saying “Exception from HRESULT: 0xF9F0F308”. Sometimes when you are editing a file (specially large ones), VS doesn’t recognize you’ve made changes (ie doesn’t display that ‘*’ in the files tabs) hence, when you save, nothing actually gets saved. For those 2 problems, a friend explained the problem and a work around (till they officially release a fix)…Open up a Visual Studio 2008 Command Prompt Run cd "C:\Program Files (x86)\Microsoft Visual Studio 9.0\Common7\IDE" Make a backup copy of devenv.exe in case something does not work right.
ie. copy devenv.exe devenv.exe.bak Run editbin /largeaddressaware:no devenv.exe Happy VSing… :)