Big camera improvements.
This commit is contained in:
@@ -5,6 +5,8 @@
|
|||||||
#include "Demo.h"
|
#include "Demo.h"
|
||||||
#include "AudioPlayer.h"
|
#include "AudioPlayer.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
CameraController::CameraController(){
|
CameraController::CameraController(){
|
||||||
yaw=0;
|
yaw=0;
|
||||||
pitch=0;
|
pitch=0;
|
||||||
@@ -13,8 +15,9 @@ CameraController::CameraController(){
|
|||||||
backwards=false;
|
backwards=false;
|
||||||
left=false;
|
left=false;
|
||||||
right=false;
|
right=false;
|
||||||
|
zoom=7.f;
|
||||||
rightButtonHolding=false;
|
rightButtonHolding=false;
|
||||||
|
focusPosition=Vector3(0,0,0);
|
||||||
}
|
}
|
||||||
|
|
||||||
GCamera* CameraController::getCamera()
|
GCamera* CameraController::getCamera()
|
||||||
@@ -39,6 +42,7 @@ void CameraController::setFrame(const CoordinateFrame& cf) {
|
|||||||
Vector3 look = cf.getLookVector();
|
Vector3 look = cf.getLookVector();
|
||||||
g3dCamera.setCoordinateFrame(cf);
|
g3dCamera.setCoordinateFrame(cf);
|
||||||
lookAt(cf.translation + look);
|
lookAt(cf.translation + look);
|
||||||
|
focusPosition=cf.translation+cf.lookVector()*zoom;
|
||||||
}
|
}
|
||||||
|
|
||||||
CoordinateFrame CameraController::getCoordinateFrame() {
|
CoordinateFrame CameraController::getCoordinateFrame() {
|
||||||
@@ -48,25 +52,45 @@ CoordinateFrame CameraController::getCoordinateFrame() {
|
|||||||
return cf;
|
return cf;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CameraController::pan(int spdX, int spdY)
|
void CameraController::pan(CoordinateFrame* frame,float spdX, float spdY)
|
||||||
{
|
{
|
||||||
|
yaw+=spdX;
|
||||||
|
pitch+=spdY;
|
||||||
|
|
||||||
|
if (pitch>1.4f) pitch=1.4f;
|
||||||
|
if (pitch<-1.4f) pitch=-1.4f;
|
||||||
|
frame->translation = Vector3(sin(-yaw)*zoom*cos(pitch),sin(pitch)*zoom,cos(-yaw)*zoom*cos(pitch))+focusPosition;
|
||||||
|
frame->lookAt(focusPosition);
|
||||||
}
|
}
|
||||||
bool CameraController::onMouseWheel(int x, int y, short delta)
|
bool CameraController::onMouseWheel(int x, int y, short delta)
|
||||||
{
|
{
|
||||||
CoordinateFrame frame = g3dCamera.getCoordinateFrame();
|
CoordinateFrame frame = g3dCamera.getCoordinateFrame();
|
||||||
|
|
||||||
if (delta>0) { // Mouse wheel up
|
if (delta>0) { // Mouse wheel up
|
||||||
g3dCamera.setCoordinateFrame(g3dCamera.getCoordinateFrame() + frame.lookVector()*2);
|
if (zoom>CAM_ZOOM_MIN)
|
||||||
|
frame = frame+frame.lookVector()*(zoom/5);
|
||||||
|
|
||||||
|
//setFrame(frame);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
g3dCamera.setCoordinateFrame(g3dCamera.getCoordinateFrame() - frame.lookVector()*2);
|
//zoom+=0.5;
|
||||||
|
if (zoom<CAM_ZOOM_MAX)
|
||||||
|
frame = frame-frame.lookVector()*(zoom/5);
|
||||||
|
//setFrame(frame);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
zoom=(frame.translation-focusPosition).magnitude();
|
||||||
|
if (zoom<CAM_ZOOM_MIN) zoom=CAM_ZOOM_MIN;
|
||||||
|
if (zoom>CAM_ZOOM_MAX) zoom=CAM_ZOOM_MAX;
|
||||||
|
|
||||||
|
setFrame(frame);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CameraController::panLeft()
|
void CameraController::panLeft()
|
||||||
{
|
{
|
||||||
CoordinateFrame frame = g3dCamera.getCoordinateFrame();
|
CoordinateFrame frame = g3dCamera.getCoordinateFrame();
|
||||||
|
/*
|
||||||
float y = frame.translation.y;
|
float y = frame.translation.y;
|
||||||
CoordinateFrame frame2 = CoordinateFrame(frame.rotation, frame.translation + frame.lookVector()*25);
|
CoordinateFrame frame2 = CoordinateFrame(frame.rotation, frame.translation + frame.lookVector()*25);
|
||||||
Vector3 focus = Vector3(0,0,0); //frame.translation+frame.lookVector()*25;
|
Vector3 focus = Vector3(0,0,0); //frame.translation+frame.lookVector()*25;
|
||||||
@@ -76,10 +100,15 @@ void CameraController::panLeft()
|
|||||||
CoordinateFrame newFrame = CoordinateFrame(frame2.rotation, Vector3(frame2.translation.x, y, frame2.translation.z));
|
CoordinateFrame newFrame = CoordinateFrame(frame2.rotation, Vector3(frame2.translation.x, y, frame2.translation.z));
|
||||||
newFrame.lookAt(focus,frame2.upVector());
|
newFrame.lookAt(focus,frame2.upVector());
|
||||||
setFrame(CoordinateFrame(focus));
|
setFrame(CoordinateFrame(focus));
|
||||||
|
*/
|
||||||
|
pan(&frame,toRadians(-45),0);
|
||||||
|
setFrame(frame);
|
||||||
|
|
||||||
}
|
}
|
||||||
void CameraController::panRight()
|
void CameraController::panRight()
|
||||||
{
|
{
|
||||||
CoordinateFrame frame = g3dCamera.getCoordinateFrame();
|
CoordinateFrame frame = g3dCamera.getCoordinateFrame();
|
||||||
|
/*
|
||||||
float y = frame.translation.y;
|
float y = frame.translation.y;
|
||||||
CoordinateFrame frame2 = CoordinateFrame(frame.rotation, frame.translation + frame.lookVector()*25);
|
CoordinateFrame frame2 = CoordinateFrame(frame.rotation, frame.translation + frame.lookVector()*25);
|
||||||
Vector3 focus = frame.translation+frame.lookVector()*25;
|
Vector3 focus = frame.translation+frame.lookVector()*25;
|
||||||
@@ -89,36 +118,40 @@ void CameraController::panRight()
|
|||||||
CoordinateFrame newFrame = CoordinateFrame(frame2.rotation, Vector3(frame2.translation.x, y, frame2.translation.z));
|
CoordinateFrame newFrame = CoordinateFrame(frame2.rotation, Vector3(frame2.translation.x, y, frame2.translation.z));
|
||||||
newFrame.lookAt(focus);
|
newFrame.lookAt(focus);
|
||||||
setFrame(newFrame);
|
setFrame(newFrame);
|
||||||
|
*/
|
||||||
|
pan(&frame,toRadians(45),0);
|
||||||
|
setFrame(frame);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CameraController::tiltUp()
|
void CameraController::tiltUp()
|
||||||
{
|
{
|
||||||
CoordinateFrame frame = CoordinateFrame(g3dCamera.getCoordinateFrame().rotation, g3dCamera.getCoordinateFrame().translation);
|
|
||||||
Vector3 camerapoint = frame.translation;
|
|
||||||
|
|
||||||
Vector3 focalPoint = camerapoint + frame.lookVector() * 25;
|
CoordinateFrame frame = CoordinateFrame(g3dCamera.getCoordinateFrame().rotation, g3dCamera.getCoordinateFrame().translation);
|
||||||
float distance = pow(pow((double)focalPoint.x - (double)camerapoint.x, 2) + pow((double)camerapoint.y - (double)camerapoint.y, 2) + pow((double)focalPoint.z - (double)camerapoint.z, 2), 0.5);
|
pan(&frame,0,toRadians(25));
|
||||||
float x = distance * cos(22.5 * G3D::pi() / 180) + focalPoint.x;
|
setFrame(frame);
|
||||||
float z = distance * sin(22.5 * G3D::pi() / 180) + focalPoint.z;
|
|
||||||
camerapoint = Vector3(camerapoint.x, camerapoint.y+2, camerapoint.z);
|
|
||||||
|
|
||||||
CoordinateFrame newFrame = CoordinateFrame(camerapoint);
|
|
||||||
newFrame.lookAt(focalPoint);
|
|
||||||
Vector3 cameraPos = camerapoint;
|
|
||||||
frame = newFrame;
|
|
||||||
setFrame(newFrame);
|
|
||||||
}
|
}
|
||||||
void CameraController::tiltDown()
|
void CameraController::tiltDown()
|
||||||
{
|
{
|
||||||
|
CoordinateFrame frame = CoordinateFrame(g3dCamera.getCoordinateFrame().rotation, g3dCamera.getCoordinateFrame().translation);
|
||||||
|
pan(&frame,0,toRadians(-25));
|
||||||
|
setFrame(frame);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CameraController::centerCamera(Instance* selection)
|
void CameraController::centerCamera(Instance* selection)
|
||||||
{
|
{
|
||||||
CoordinateFrame frame = CoordinateFrame(g3dCamera.getCoordinateFrame().translation);
|
CoordinateFrame frame = CoordinateFrame(g3dCamera.getCoordinateFrame().translation);
|
||||||
if(selection == NULL)
|
if(selection == NULL)
|
||||||
|
{
|
||||||
lookAt(Vector3(0,0,0));
|
lookAt(Vector3(0,0,0));
|
||||||
|
focusPosition=Vector3(0,0,0);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
lookAt(((PhysicalInstance*)selection)->getPosition()/2);
|
{
|
||||||
|
Vector3 partPos = ((PhysicalInstance*)selection)->getPosition()/2;
|
||||||
|
lookAt(partPos);
|
||||||
|
focusPosition=partPos;
|
||||||
|
zoom=((partPos-frame.translation).magnitude());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CameraController::update(Demo* demo)
|
void CameraController::update(Demo* demo)
|
||||||
@@ -127,18 +160,22 @@ void CameraController::update(Demo* demo)
|
|||||||
|
|
||||||
Vector3 cameraPos = g3dCamera.getCoordinateFrame().translation;
|
Vector3 cameraPos = g3dCamera.getCoordinateFrame().translation;
|
||||||
CoordinateFrame frame = g3dCamera.getCoordinateFrame();
|
CoordinateFrame frame = g3dCamera.getCoordinateFrame();
|
||||||
|
bool moving=false;
|
||||||
if(GetHoldKeyState('U')) {
|
if(GetHoldKeyState('U')) {
|
||||||
forwards = true;
|
forwards = true;
|
||||||
|
moving=true;
|
||||||
}
|
}
|
||||||
if(GetHoldKeyState('J')) {
|
if(GetHoldKeyState('J')) {
|
||||||
backwards = true;
|
backwards = true;
|
||||||
|
moving=true;
|
||||||
}
|
}
|
||||||
if(GetHoldKeyState('H')) {
|
if(GetHoldKeyState('H')) {
|
||||||
left = true;
|
left = true;
|
||||||
|
moving=true;
|
||||||
}
|
}
|
||||||
if(GetHoldKeyState('K')) {
|
if(GetHoldKeyState('K')) {
|
||||||
right = true;
|
right = true;
|
||||||
|
moving=true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(forwards) {
|
if(forwards) {
|
||||||
@@ -158,16 +195,26 @@ void CameraController::update(Demo* demo)
|
|||||||
frame.translation += frame.rightVector()*moveRate;
|
frame.translation += frame.rightVector()*moveRate;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (moving)
|
||||||
|
{
|
||||||
|
zoom=7;
|
||||||
|
focusPosition=frame.translation+frame.lookVector()*zoom;
|
||||||
|
}
|
||||||
|
|
||||||
if(rightButtonHolding) {
|
if(rightButtonHolding) {
|
||||||
POINT mouse;
|
POINT mouse;
|
||||||
GetCursorPos(&mouse);
|
GetCursorPos(&mouse);
|
||||||
|
pan(&frame,(mouse.x-oldDesktopMouse.x)/100.f,(mouse.y-oldDesktopMouse.y)/100.f);
|
||||||
yaw+=(mouse.x-oldDesktopMouse.x)/100.f;
|
//yaw+=(mouse.x-oldDesktopMouse.x)/100.f;
|
||||||
pitch+=(mouse.y-oldDesktopMouse.y)/100.f;
|
//pitch+=(mouse.y-oldDesktopMouse.y)/100.f;
|
||||||
|
|
||||||
SetCursorPos(oldDesktopMouse.x,oldDesktopMouse.y);
|
SetCursorPos(oldDesktopMouse.x,oldDesktopMouse.y);
|
||||||
frame.rotation = Matrix3::fromEulerAnglesZYX(0, -yaw, -pitch);
|
//std::cout << pitch << std::endl;
|
||||||
|
//if (pitch>1.4) pitch=1.4;
|
||||||
|
//if (pitch<-1.4) pitch=-1.4;
|
||||||
|
//frame.translation = Vector3(sin(-yaw)*zoom*cos(pitch),sin(pitch)*zoom,cos(-yaw)*zoom*cos(pitch))+focusPosition;
|
||||||
|
//frame.lookAt(focusPosition);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if(GetHoldKeyState(VK_RSHIFT) || GetHoldKeyState(VK_LSHIFT)) {
|
if(GetHoldKeyState(VK_RSHIFT) || GetHoldKeyState(VK_LSHIFT)) {
|
||||||
|
|||||||
@@ -4,6 +4,9 @@
|
|||||||
#include "Instance.h"
|
#include "Instance.h"
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
|
#define CAM_ZOOM_MIN 0.1f
|
||||||
|
#define CAM_ZOOM_MAX 100.f
|
||||||
|
|
||||||
class Demo;
|
class Demo;
|
||||||
|
|
||||||
class CameraController {
|
class CameraController {
|
||||||
@@ -13,7 +16,7 @@ class CameraController {
|
|||||||
|
|
||||||
void setFrame(const CoordinateFrame& cf);
|
void setFrame(const CoordinateFrame& cf);
|
||||||
void lookAt(const Vector3& position);
|
void lookAt(const Vector3& position);
|
||||||
void pan(int spdX,int spdY);
|
void pan(CoordinateFrame* frame,float spdX,float spdY);
|
||||||
void update(Demo* demo);
|
void update(Demo* demo);
|
||||||
void centerCamera(Instance* selection);
|
void centerCamera(Instance* selection);
|
||||||
void panLeft();
|
void panLeft();
|
||||||
@@ -28,6 +31,7 @@ class CameraController {
|
|||||||
float yaw;
|
float yaw;
|
||||||
float pitch;
|
float pitch;
|
||||||
float moveRate;
|
float moveRate;
|
||||||
|
float zoom;
|
||||||
bool forwards;
|
bool forwards;
|
||||||
bool backwards;
|
bool backwards;
|
||||||
bool left;
|
bool left;
|
||||||
|
|||||||
4
main.cpp
4
main.cpp
@@ -180,6 +180,8 @@ void CameraButtonListener::onButton1MouseClick(BaseButtonInstance* button)
|
|||||||
usableApp->cameraController.panLeft();
|
usableApp->cameraController.panLeft();
|
||||||
else if(button->name == "TiltUp")
|
else if(button->name == "TiltUp")
|
||||||
usableApp->cameraController.tiltUp();
|
usableApp->cameraController.tiltUp();
|
||||||
|
else if(button->name == "TiltDown")
|
||||||
|
usableApp->cameraController.tiltDown();
|
||||||
}
|
}
|
||||||
|
|
||||||
class GUDButtonListener : public ButtonListener {
|
class GUDButtonListener : public ButtonListener {
|
||||||
@@ -612,7 +614,7 @@ void Demo::initGUI()
|
|||||||
void Demo::onInit() {
|
void Demo::onInit() {
|
||||||
|
|
||||||
// Called before Demo::run() beings
|
// Called before Demo::run() beings
|
||||||
cameraController.getCamera()->setCoordinateFrame(cameraPos);
|
cameraController.setFrame(cameraPos);
|
||||||
dataModel = new DataModelInstance();
|
dataModel = new DataModelInstance();
|
||||||
dataModel->setParent(NULL);
|
dataModel->setParent(NULL);
|
||||||
dataModel->name = "undefined";
|
dataModel->name = "undefined";
|
||||||
|
|||||||
Reference in New Issue
Block a user