Autor Wątek: Przeliczanie rotacji w Blenderze na rotacje w OpenGL.  (Przeczytany 1762 razy)

Offline voytech

  • Użytkownik

# Maj 08, 2017, 01:26:08
Na pewno prześledzę implementację.

Czekaj, może lepiej nie.

Tamten kod jest zbyt stary i brzydki. Mam obecnie coś na widoku i będzie mi potrzebna kamera
więc postanowiłem, że trochę ten kod poprawię (patrz załącznik). Dużo się jeszcze zmieni ale
obecnie kamera wygląda tak:
Kod: (cpp) [Zaznacz]
enum class Moves {
    FORWARD, BACK, RIGHT, LEFT, UP, DOWN, TURN_CW, TURN_CCW, TURN_UP, TURN_DOWN
};

class Camera {
    glm::vec3 _pos {0, 3, 4};
    glm::vec3 _up  {0, 1, 0};

    float _angleLeftRight =   0.0f;
    float _angleUpDown    =   0.0f;
    float _moveSpeed      = 0.005f;   
    float _rotateSpeed    =  30.0f;
   
    const float MIN_ANGLE = -85.0f;
    const float MAX_ANGLE =  85.0f;
public:
    void moveCamera( const float delta, const Moves dir) {
        switch (dir) {
        case Moves::RIGHT   : _pos += getRight() * delta * _moveSpeed; break;
        case Moves::LEFT    : _pos -= getRight() * delta * _moveSpeed; break;
        case Moves::FORWARD : _pos += getDir()   * delta * _moveSpeed; break;
        case Moves::BACK    : _pos -= getDir()   * delta * _moveSpeed; break;
        case Moves::UP      : _pos += getUp()    * delta * _moveSpeed; break;
        case Moves::DOWN    : _pos -= getUp()    * delta * _moveSpeed; break;
        case Moves::TURN_CW :
                     _angleLeftRight += delta * _moveSpeed * _rotateSpeed;
                     if (_angleLeftRight >=  360.0) _angleLeftRight -= 360.0;
                     if (_angleLeftRight <= -360.0) _angleLeftRight += 360.0;
                     break;
        case Moves::TURN_CCW:
                     _angleLeftRight -= delta * _moveSpeed * _rotateSpeed;
                     if (_angleLeftRight >=  360.0) _angleLeftRight -= 360.0;
                     if (_angleLeftRight <= -360.0) _angleLeftRight += 360.0;
                     break;
        case Moves::TURN_UP:
                    _angleUpDown += delta * _moveSpeed * _rotateSpeed;
                    if (_angleUpDown > MAX_ANGLE) _angleUpDown = MAX_ANGLE;
                    if (_angleUpDown < MIN_ANGLE) _angleUpDown = MIN_ANGLE;
                    break;
        case Moves::TURN_DOWN:
                    _angleUpDown -= delta * _moveSpeed * _rotateSpeed;
                    if (_angleUpDown > MAX_ANGLE) _angleUpDown = MAX_ANGLE;
                    if (_angleUpDown < MIN_ANGLE) _angleUpDown = MIN_ANGLE;
                    break;
        }
    }

    //setters
    void setPosition( const  glm::vec3 pos )   { _pos = pos; }
    void setAngleLeftRight( const float angle ) { _angleLeftRight = angle; }
    void setAngleUpDown( const float angle ) { // exception???
        _angleUpDown = angle;
        if (_angleUpDown > MAX_ANGLE|| _angleUpDown < MIN_ANGLE)
            _angleUpDown = 0;
    }
    void setOrientation( const float angleLeftRight, const float angleUpDown ) {
        setAngleLeftRight( angleLeftRight );
        setAngleUpDown( angleUpDown );
    }
    // getters
    glm::vec3 getRight() const          { return glm::normalize( glm::cross( getDir(), _up ) ); }
    glm::mat4 getLookAtMatrix() const   { return glm::lookAt( getPosition(), getCenter(), getUp() ); }
    glm::vec3 getPosition() const       { return glm::vec3( _pos ); }
    float     getAngleLeftRight() const { return _angleLeftRight; }
    float     getAngleUpDown() const    { return _angleUpDown; }
    glm::vec3 getCenter() const         { return glm::vec3( _pos + getDir() ); }
    glm::vec3 getUp() const             { return glm::vec3( _up ); }
    glm::vec3 getDir() const {
        float lr = glm::radians( _angleLeftRight );
        float ud = glm::radians( _angleUpDown );
        return glm::vec3(-sinf( -lr ) * cosf( ud ), sinf(  ud ), -cosf( -lr ) * cosf( ud ) );
    }
};

W przyszłości planuję zrobić kamerę bardziej elastyczną, której będzie się podawać płaszczyznę będącą dla niej "podłogą", ale na chwilę obecną to co jest działa dobrze i zachowuje się prawie tak jak w Blenderze po naciśnięciu SHIFT-f (grawitacji i regulacji prędkości poruszania się jeszcze nie ma).

Ps. jak tam twój eksporter w blenderze? W tym programiku z blendera eksportowałem do formatu Stanford "*.ply" a potem prostym skryptem przerobiłem na plik nagłówkowy "*.h".

Planujesz jakiś własny format? Binarny czy tekstowy? Jeżeli tekstowy to według mnie najlepiej jako kod źródłowy (c/c++, python, java, etc), żeby było łatwo wkleić do własnego programu jakieś proste bryły. Albo jeszcze lepiej wyeksportować jako JSON (eksportery tego pliku są dostępne w wielu językach).

Offline Mr. Spam

  • Miłośnik przetworów mięsnych