Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!
Werbeanzeige
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
#include "Component.h" #include <glm/glm.hpp> #include <glm/gtx/transform.hpp> #include <vector> #include <iostream> class TransformComponent : public Component { public: TransformComponent(); virtual ~TransformComponent(); void Update() {} void Translate(glm::vec3 delta); void Rotate(glm::vec3 delta); void RotateAround(glm::vec3 delta) {}; void Scale(glm::vec3 delta); glm::mat4 GetModel() const { return glm::translate(m_position) * glm::rotate(m_rotation.z, glm::vec3(0,0,1)) * glm::rotate(m_rotation.y, glm::vec3(0,1,0)) * glm::rotate(m_rotation.x, glm::vec3(1,0,0)) * glm::scale(m_scale); } glm::vec3 getPosition() { return m_position; } glm::vec3 getRotation() { return m_rotation; } glm::vec3 getScale() { return m_scale; } void setPosition(glm::vec3 position) { m_position = position; } void setRotation(glm::vec3 rotation) { m_rotation = rotation; } void setScale(glm::vec3 scale) { m_scale = scale; } glm::vec3 getForward() { return glm::vec3(0,0,1)*GetModel(); } // <-Problem void AddChildTransform(TransformComponent* pChildTransform) { m_childTransforms.push_back(pChildTransform); pChildTransform->setParentTransform(this); } void setParentTransform(TransformComponent* pParentTransform) { m_pParentTransform = pParentTransform; } private: glm::vec3 m_position; glm::vec3 m_rotation; glm::vec3 m_scale; std::vector<TransformComponent*> m_childTransforms; TransformComponent* m_pParentTransform; }; |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 |
glm::vec3 getForward() { const float* matrix = glm::value_ptr(m_modelMatrix); std::cout << matrix[6] << " - " << matrix[8] << " - " << matrix[10] << std::endl; return glm::vec3(matrix[6], matrix[8], matrix[10]); } |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
class TransformComponent : public Component { public: TransformComponent(); virtual ~TransformComponent(); void Update() { m_modelMatrix = glm::translate(m_position) * mat4_cast(m_rotation) * glm::scale(m_scale); } void Translate(glm::vec3 delta); void Rotate(glm::vec3 delta); void RotateAround(glm::vec3 delta) {}; void Scale(glm::vec3 delta); glm::mat4 GetModel() const { return m_modelMatrix; } glm::vec3 getPosition() { return m_position; } glm::quat getRotation() { return m_rotation; } glm::vec3 getScale() { return m_scale; } void setPosition(glm::vec3 position) { m_position = position; } void setRotation(glm::vec3 eulerAngles) { m_rotation = glm::quat(eulerAngles); } void setScale(glm::vec3 scale) { m_scale = scale; } glm::vec3 getForward() <------- { const float* matrix = glm::value_ptr(m_modelMatrix); std::cout << matrix[6] << " - " << matrix[8] << " - " << matrix[10] << std::endl; return glm::vec3(matrix[6], matrix[8], matrix[10]); } glm::vec3 getRight() { return glm::vec3(sin(m_rotation.x+glm::radians(-90.0f)), 0.0f, cos(m_rotation.x+glm::radians(-90.0f))); } void AddChildTransform(TransformComponent* pChildTransform) { m_childTransforms.push_back(pChildTransform); pChildTransform->setParentTransform(this); } void setParentTransform(TransformComponent* pParentTransform) { m_pParentTransform = pParentTransform; } private: glm::vec3 m_position; glm::quat m_rotation; glm::vec3 m_scale; glm::mat4 m_modelMatrix; std::vector<TransformComponent*> m_childTransforms; TransformComponent* m_pParentTransform; }; |
Laut dieser Seite geben Element 6, 8 und 10 den Vorwärts Vektor des Objektes wieder.
Die EulerWinkel wurden durch Quaternions ersetzt. Es werden nur noch EulerWinkel in der Rotate() Funktion verwendet, diese werden aber sofort in eine Quaternion umgewandelt.
Wo genau willst du das dort gelesen haben? Wenn dann wohl Elemente 8, 9 und 10; aber auch das funktioniert nur wirklich für eine bestimmte Klasse von Transformationsmatrizen und gilt nicht allgemein, im Gegensatz zu dem, was auf dieser Seite so steht...
Mein Fehler. Meinte natürlich 9,8,10. Leider erhalte ich so aber auch nur den untransformierten Vorwärts Vektor. Also (0,0,1).
Diese Methode scheidet also leider aus.
Hmm, ich orientiere mich in meiner Architektur stark an der Unity Engine. Diese nimmt auch 3 Winkel als Argumente für die Rotation, obwohl die Rotation in einer Quaternion gespeichert wird.
Ich denke ich muss mich etwas mehr über Quaternions, vor allem wie man sie einsetzt, informieren.
C-/C++-Quelltext |
|
1 |
m_modelMatrix = glm::translate(m_position) * mat4_cast(m_rotation) * glm::scale(m_scale); |
Werbeanzeige