<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
  <channel>
    <title>'view matrix resets itself.' Thread RSS Feed</title>
    <link>http://www.programmersheaven.com/</link>
    <description>Contains the latest posts from the thread 'view matrix resets itself.' posted on the 'DirectX' forum at Programmer's Heaven.</description>
    <language>en</language>
    <copyright>Copyright 2012 Programmers Heaven</copyright>
    <pubDate>Thu, 09 Feb 2012 08:36:19 -0800</pubDate>
    <lastBuildDate>Thu, 09 Feb 2012 08:36:19 -0800</lastBuildDate>
    <generator>Argotic Syndication Framework 2007.3.0.1, http://www.codeplex.com/Argotic</generator>
    <docs>http://www.rssboard.org/rss-specification</docs>
    <ttl>360</ttl>
    <image>
      <url>http://www.programmersheaven.com/images/ph.gif</url>
      <title>Programmers Heaven</title>
      <link>http://www.programmersheaven.com/</link>
      <width>88</width>
      <height>31</height>
    </image>
    <item>
      <title>view matrix resets itself.</title>
      <link>http://www.programmersheaven.com/mb/DirectX/409730/409730/view-matrix-resets-itself/</link>
      <description>I have written a Camera class that utilises direct input to rotate view matrix.  For some reason, the view rotates when I move the mouse but then suddenly snaps back to the original rotation.  Any idea why?&lt;br /&gt;
&lt;br /&gt;
Camera.cpp&lt;br /&gt;
&lt;pre class="sourcecode"&gt;
#include "Camera.h"

Camera::Camera(D3DXVECTOR3 m_pos, LPDIRECT3DDEVICE9 m_pdxDevice, HINSTANCE hInst, HWND gameWindow)
{
	_position = m_pos;
	_look = D3DXVECTOR3(0,0,0);
	_up = D3DXVECTOR3(0,1,0);

	D3DXMatrixPerspectiveFovLH(&amp;amp;_projection, D3DX_PI/4, 500/500, 1, 500);
	m_pdxDevice-&amp;gt;SetTransform(D3DTS_PROJECTION, &amp;amp;_projection);

	//----INITIALISE INPUT---------
	DirectInput8Create(hInst, DIRECTINPUT_VERSION, IID_IDirectInput8, (void**)&amp;amp;pDirectInput, NULL);
	pDirectInput-&amp;gt;CreateDevice(GUID_SysKeyboard, &amp;amp;pKeyboard, NULL);
	pKeyboard-&amp;gt;SetDataFormat(&amp;amp;c_dfDIKeyboard);
	pKeyboard-&amp;gt;SetCooperativeLevel(gameWindow, DISCL_FOREGROUND | DISCL_NONEXCLUSIVE);
	pKeyboard-&amp;gt;Acquire();

	pDirectInput-&amp;gt;CreateDevice(GUID_SysMouse, &amp;amp;pMouse, NULL);
	pMouse-&amp;gt;SetDataFormat(&amp;amp;c_dfDIMouse);
	pMouse-&amp;gt;SetCooperativeLevel(gameWindow, DISCL_FOREGROUND | DISCL_NONEXCLUSIVE);
	pMouse-&amp;gt;Acquire();
}

void Camera::ProcessKeyboard()
{
	char KeyboardState[256];

	pKeyboard-&amp;gt;GetDeviceState(sizeof(KeyboardState),(LPVOID)&amp;amp;Key
boardState);
	if(KEYDOWN(KeyboardState, DIK_RIGHT)) { _position.x++; _look.x++; }
	if(KEYDOWN(KeyboardState, DIK_LEFT)) { _position.x--; _look.x--; }
	if(KEYDOWN(KeyboardState, DIK_UP)) { _position.z++; _look.z++; }
	if(KEYDOWN(KeyboardState, DIK_DOWN)) { _position.z--; _look.z--; }
}

void Camera::ProcessMouse()
{
	DIMOUSESTATE MouseState;
	pMouse-&amp;gt;GetDeviceState(sizeof(MouseState),(LPVOID)&amp;amp;MouseS
tate);

	_yaw = MouseState.lX / 80.0f;
	_pitch = MouseState.lY / 80.0f;
}

void Camera::Update(LPDIRECT3DDEVICE9 m_pdxDevice)
{
	ProcessKeyboard(); ProcessMouse();

	D3DXMatrixLookAtLH(&amp;amp;_view, &amp;amp;_position, &amp;amp;_look, &amp;amp;_up);
	m_pdxDevice-&amp;gt;SetTransform(D3DTS_VIEW, &amp;amp;_view);

	_up=D3DXVECTOR3(0,1,0);
	_look=D3DXVECTOR3(0,0,1);
	_right=D3DXVECTOR3(1,0,0);

	D3DXMATRIX yawMatrix;
	D3DXMatrixRotationAxis(&amp;amp;yawMatrix, &amp;amp;_up, _yaw);
	// To apply yaw we rotate the m_look &amp;amp; m_right vectors about the m_up vector (using our yaw matrix)
	D3DXVec3TransformCoord(&amp;amp;_look, &amp;amp;_look, &amp;amp;yawMatrix); 
	D3DXVec3TransformCoord(&amp;amp;_right, &amp;amp;_right, &amp;amp;yawMatrix); 

	// Pitch is rotation around the x axis (m_right)
	// Create a matrix that can carry out this rotation
	D3DXMATRIX pitchMatrix;
	D3DXMatrixRotationAxis(&amp;amp;pitchMatrix, &amp;amp;_right, _pitch);
	// To apply pitch we rotate the m_look and m_up vectors about the m_right vector (using our pitch matrix)
	D3DXVec3TransformCoord(&amp;amp;_look, &amp;amp;_look, &amp;amp;pitchMatrix); 
	D3DXVec3TransformCoord(&amp;amp;_up, &amp;amp;_up, &amp;amp;pitchMatrix); 
		
	// Roll is rotation around the z axis (m_look)
	// Create a matrix that can carry out this rotation
	D3DXMATRIX rollMatrix;
	D3DXMatrixRotationAxis(&amp;amp;rollMatrix, &amp;amp;_look, _roll);
	// To apply roll we rotate up and right about the look vector (using our roll matrix)
	// Note: roll only really applies for things like aircraft unless you are implementing lean
	D3DXVec3TransformCoord(&amp;amp;_right, &amp;amp;_right, &amp;amp;rollMatrix); 
	D3DXVec3TransformCoord(&amp;amp;_up, &amp;amp;_up, &amp;amp;rollMatrix); 

	// Build the view matrix from the transformed camera axis
	D3DXMATRIX *m_view = &amp;amp;_view;
	D3DXMatrixIdentity(m_view);

	m_view-&amp;gt;_11 = _right.x; m_view-&amp;gt;_12 = _up.x; m_view-&amp;gt;_13 = _look.x;
	m_view-&amp;gt;_21 = _right.y; m_view-&amp;gt;_22 = _up.y; m_view-&amp;gt;_23 = _look.y;
	m_view-&amp;gt;_31 = _right.z; m_view-&amp;gt;_32 = _up.z; m_view-&amp;gt;_33 = _look.z;
	
	m_view-&amp;gt;_41 = - D3DXVec3Dot( &amp;amp;_position,&amp;amp;_right); 
	m_view-&amp;gt;_42 = - D3DXVec3Dot( &amp;amp;_position,&amp;amp;_up);
	m_view-&amp;gt;_43 = - D3DXVec3Dot( &amp;amp;_position,&amp;amp;_look);
}

void Camera::SetPosition(D3DXVECTOR3 m_pos)
{
	_position = m_pos;
}

Camera::~Camera(void)
{
}
&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
Camera.h&lt;br /&gt;
&lt;pre class="sourcecode"&gt;
#include&amp;lt;d3d9.h&amp;gt;
#include&amp;lt;d3dx9.h&amp;gt;
#include&amp;lt;dinput.h&amp;gt;
#define KEYDOWN(name, key) (name[key] &amp;amp; 0x80)
#pragma once

class Camera
{
public:
	Camera(D3DXVECTOR3 position, LPDIRECT3DDEVICE9 device, HINSTANCE hInst, HWND gameWindow);
	void Update(LPDIRECT3DDEVICE9 m_pdxDevice);

	void SetPosition(D3DXVECTOR3 position);

	float GetYaw() const {return _yaw;}
	float GetPitch() const {return _pitch;}
	float GetRoll() const {return _roll;}
	D3DXVECTOR3 GetPosition() const {return _position;}	
	D3DXMATRIX GetViewMatrix() const {return _view;}

	// Move operations
	void MoveForward(float amount);
	void MoveRight(float amount);
	void MoveUp(float amount);

	// Rotations
	void Yaw(float amount); // rotate around x axis
	void Pitch(float amount); // rotate around x axis
	void Roll(float amount); // rotate around z axis	
	
	~Camera(void);

private:
	D3DXVECTOR3 _position;
	D3DXVECTOR3 _up, _look, _right;
	float _yaw, _pitch, _roll;

	D3DXMATRIX _view;
	D3DXMATRIX _projection;	
	LPDIRECTINPUT8 pDirectInput; 
	LPDIRECTINPUTDEVICE8 pKeyboard;
	LPDIRECTINPUTDEVICE8 pMouse;

	void ProcessKeyboard(void);
	void ProcessMouse(void);

};
&lt;/pre&gt;&lt;br /&gt;</description>
      <guid isPermaLink="true">http://www.programmersheaven.com/mb/DirectX/409730/409730/view-matrix-resets-itself/</guid>
      <pubDate>Sun, 22 Nov 2009 10:03:06 -0800</pubDate>
      <category>DirectX</category>
    </item>
  </channel>
</rss>
