Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Программирование игр, графики и искусственного интеллекта > OpenGL Camera Class


Автор: kemiisto 3.4.2009, 00:50
Всем привет! Я пришёл с очередной тупостью. smile 
В общем накидал на коленках:
camera.h
Код

#ifndef CAMERA_H
#define CAMERA_H

#include "crossgl.h"

class Point3D;

class Camera
{
public:
  Camera();
  GLfloat distance() const;
  GLfloat xRot() const;
  GLfloat yRot() const;
  GLfloat zRot() const;
  GLfloat zoomFactor() const;
  Point3D position() const;
  void setDistance(GLfloat distance);
  void setXRot(GLfloat xRot);
  void setYRot(GLfloat yRot);
  void setZRot(GLfloat zRot);
  void setZoomFactor(GLfloat zoomFactor);
  void setAspectRatio(GLfloat aspectRatio);
  void place();
private:
  GLfloat distance_;
  GLfloat xRot_;
  GLfloat yRot_;
  GLfloat zRot_;
  GLfloat zoomFactor_;
  GLfloat aspectRatio_;
  GLfloat zNear_;
  GLfloat zFar_;
  void normalizeAngle(GLfloat* angle);
};

#endif // CAMERA_H

camera.cpp
Код

#include <cmath>

#include "camera.h"
#include "crossglu.h"
#include "point3d.h"

const GLfloat PI = 4.0f * atanf(1.0f);

Camera::Camera():
    distance_(0.0f), xRot_(0.0f), yRot_(0.0f), zRot_(0.0f), zoomFactor_(1.0f)
{
}

GLfloat Camera::distance() const
{
  return distance_;
}

GLfloat Camera::xRot() const
{
  return xRot_;
}

GLfloat Camera::yRot() const
{
  return yRot_;
}

GLfloat Camera::zRot() const
{
  return zRot_;
}

GLfloat Camera::zoomFactor() const
{
  return zoomFactor_;
}

Point3D Camera::position() const
{
//  собственно тут проблема! как получить текущие координаты камеры???
  return Point3D(x, y, z);
}

void Camera::setDistance(GLfloat distance)
{
  distance_ = distance;
}

void Camera::setXRot(GLfloat xRot)
{
  xRot_ = xRot;
  normalizeAngle(&xRot);
}

void Camera::setYRot(GLfloat yRot)
{
  yRot_ = yRot;
  normalizeAngle(&yRot);
}

void Camera::setZRot(GLfloat zRot)
{
  zRot_ = zRot;
  normalizeAngle(&zRot);
}

void Camera::setZoomFactor(GLfloat zoomFactor)
{
  if (zoomFactor > 3.0f)
    zoomFactor_ = 3.0f;
  else
    if (zoomFactor < 0.3f)
      zoomFactor_ = 0.3f;
    else
      zoomFactor_ = zoomFactor;
}

void Camera::setAspectRatio(GLfloat aspectRatio)
{
  aspectRatio_ = aspectRatio;
}

void Camera::place()
{
  // Start specifying the projection transformation.
  glMatrixMode(GL_PROJECTION);
  // Initialize the current projection matrix.
  // Only the specified projection transformation has an effect.
  glLoadIdentity();
  // Specify a viewing frustum.
  gluPerspective(45.0f / zoomFactor_, aspectRatio_, 1.0, 20.0);
  // Return to modeling/viewing transformation.
  glMatrixMode(GL_MODELVIEW);
  // Reset the current matrix to the "identity"
  glLoadIdentity();
  glTranslated(0.0f, 0.0f, -distance_);
  glRotated(xRot_, 1.0f, 0.0f, 0.0f);
  glRotated(yRot_, 0.0f, 1.0f, 0.0f);
  glRotated(zRot_, 0.0f, 0.0f, 1.0f);
}

void Camera::normalizeAngle(GLfloat* angle)
{
  while (*angle < 0)
    *angle += 360;
  while (*angle > 360)
    *angle -= 360;
}


За код сильно не пинать, я начинающий плюсист. smile Я так понял, я использую углы Эйлера. Точнее http://en.wikipedia.org/wiki/Tait-Bryan_angles. Меня всё бы устроило, но я никак не могу пересчитать эти углы в трёхмерные координаты камеры. smile 

Может, кто сталкивался?
Или может у кого завалялся классик?

P.S. Не предлагать из NeHe! Я не понимаю, как там это работает. smile  

Автор: NuINu 9.4.2009, 21:16
Зачем же вы ввзязались в эти углы эйлера? любите кватернионы?

вообщем даю пару подсказок это cal3d там есть все.
А так же смотрите Борескова, там так же есть ВСЕ и даже больше. http://www.steps3d.narod.ru/
рекомендую его книгу Графика трехмерной компьюерной инры на основе OPENGL

Автор: kemiisto 10.4.2009, 00:09
NuINu, за ссылки спасибо! smile Может, когда-нибудь... Но, видимо, не в этой жизни. smile 

P.S. Решил не изобретать колесо и заюзать http://www.libqglviewer.com/.

Автор: Rickert 10.4.2009, 07:39
Чтоб камеру правильно создать,
Пример её с gametutorials нужно взять.
Про вектор вспомни, а углы - забудь,
Реализуй за день и счастлив будь smile 

Автор: kemiisto 10.4.2009, 13:28
Rickert, smile Даже в стихах... Хороший туториал, видел. Я так понимаю, это http://wingman.org.ru/opengl же, только переведённое. Но я уже QGLViewer почти прикрутил... Так что обойдусь малой кровью. smile 

Автор: Rickert 10.4.2009, 17:44
kemiisto, всё верно smile 

Автор: kemiisto 10.4.2009, 18:10
Забавно, кстати, было поковырять различные примеры. smile Нехилая гимнастика ума! Линейная алгебра, стереометрия, пространственное мышление... smile   

Автор: Rickert 11.4.2009, 05:02
kemiisto, айда к нам в гейм девелопмент smile 

Автор: kemiisto 11.4.2009, 10:57
Цитата(Rickert @  11.4.2009,  03:02 Найти цитируемый пост)
kemiisto, айда к нам в гейм девелопмент smile 

Уж лучше вы - к нам. smile 

Автор: Yamomoto 8.6.2009, 20:37
Rickert,  smile 
kemiisto,  smile 

О великие Силы !!! Огромное спасибо вам добрые человеки,
вы помогли мне найти именно тот клас камеры в котором я нуждался.
 smile 

Автор: arilou 8.6.2009, 23:46
Yamomoto, но это не повод заниматься некропостингом  smile  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)