2017-01-04 6 views
0

オブジェクト(球)があり、球のy軸を使用するベクトルに揃えたいその中間点をプロットする。オブジェクトのY軸を親の中心点から出てくるベクトルに揃える方法

作成されたすべてのオブジェクトの軸は次のように設定されているため、ワールド空間で作成されたすべてのオブジェクトの軸方向は下の図のようになります。しかし、私は、ローカル座標の球の軸に親オブジェクト(それらが囲む球)の方向にy軸を持たせたいが、この変換のために各オブジェクトに対して何ができるかわからない発生する。下図

enter image description here

オブジェクトの所望の配向です。

Desired orientation of object axis'

子ではなく、彼らは、以下の両方の画像で行うように全て上向き、ポン外向き方向に基づいての球体ので、私は、この方向性を必要とします。だから、私が底に球を生成する場合、子球がx軸の上端で生成され、その後大きな中心球と半分に合併するのではなく、大きな中心球から外側に指してください。

以下は、私が今以下

bool static CreateSphereLevels(Sphere *parent, float childRadiusRatio, int levels, 
      Material** materials) 

{ 
    if (levels == 1) { 
     for (int i = 0; i < 6; i++) { 
      Sphere * s = new Sphere(childRadiusRatio, materials[i % 6]); 
      parent->AddChild(s); 
      float rm = parent->GetRadius() + s->GetRadius(); 
      if (i == 0) 
       s->SetPosition(vec3(0.0f, rm, 0.0f)); 
      if (i >= 1 && i < 6) 
       s->SetPosition(vec3(RotationY(60 * i) * vec4(0.0f, rm, 0.0f, 0.0f))); 
      if (i == 1 || i == 3 || i == 5) { 
       Sphere * sn = new Sphere(childRadiusRatio, materials[i]); 
       parent->AddChild(sn); 
       sn->SetPosition(vec3(RotationY(60 * i) * RotationZ(60) * vec4(0.0f, rm, 0.0f, 0.0f))); 
      } 
     } 
     return true; 
    } 
    else { 
     for (int i = 0; i < 6; i++) { 
      Sphere * s = new Sphere(childRadiusRatio, materials[i % 6]); 
      parent->AddChild(s); 
      int newLevels = levels - 1; 
      CreateSphereLevels(s, (childRadiusRatio/3), newLevels, materials); 
      float rm = parent->GetRadius() + s->GetRadius(); 
      if (i == 0) 
       s->SetPosition(vec3(0.0f, rm, 0.0f)); 
      if (i >= 1 && i < 6) 
       s->SetPosition(vec3(RotationY(60 * i) * vec4(0.0f, rm, 0.0f, 0.0f))); 
      if (i == 1 || i == 3 || i == 5) { 
       Sphere * sn = new Sphere(childRadiusRatio, materials[i]); 
       parent->AddChild(sn); 
       CreateSphereLevels(sn, (childRadiusRatio/3), newLevels, materials); 
       sn->SetPosition(vec3(RotationY(60 * i) * RotationZ(60) * vec4(0.0f, rm, 0.0f, 0.0f))); 
      } 
     } 
    } 
    return true; 
} 

(I、すなわち9を描いたが、明確化のための画像に存在する球の量を少なくして画像を乱雑にしないよりも、このコードではより多くの球を生成する)球を生成するコードがありますオブジェクト上で実行可能な変換可能性

#ifndef RAYTRACER_SCENES_SCENEOBJECT_H 
#define RAYTRACER_SCENES_SCENEOBJECT_H 

#include <Raytracer/Scenes/SceneObjectType.h> 

#include <vector> 

namespace Raytracer 
{ 
    namespace Scenes 
    { 
     class SceneObject 
     { 
     private: 

      /** 
      * The transformation matrix to transform a point from world coordinates to local 
      * coordinates. 
      */ 
      glm::mat4x4 globalTransformation; 

      glm::mat4x4 transformation; 

      glm::mat4x4 globalToLocal; 

      /** 
      * Updates the global transformation based on the current transformation. This 
      * includes child objects. 
      */ 
      void UpdateTransformations(); 

      std::vector<SceneObject *> children; 
      SceneObject * parent; 

     public: 

      /** 
      * Constructs a new SceneObject. 
      */ 
      SceneObject(); 

      /** 
      * Destructs a SceneObject and deletes all child objects. 
      */ 
      virtual ~SceneObject(); 

      /** 
      * Adds a new child to this object. 
      * 
      * @param child The new child object. This object becomes child's parent object. This 
      * object takes ownership of child. 
      * @return true if the child was added successfully, false otherwise. 
      */ 
      bool AddChild(SceneObject *child); 

      /** 
      * Retrieves a list of all children of this object. 
      * 
      * @return A list of all children of this object 
      */ 
      const std::vector<SceneObject *> &GetChildren() const; 

      /** 
      * Retrieves the position of this object in world space, i.e. the translation component 
      * of the global transformation matrix. 
      * 
      * @return The global position of this object 
      */ 
      const glm::vec3 GetGlobalPosition() const; 

      /** 
      * Retrieves a matrix that can be used to transform coordinates from world space to 
      * object space. This is the inverse of the global transformation matrix. 
      * 
      * @return The inverse of the global transformation matrix 
      */ 
      const glm::mat4x4 &GetGlobalToLocal() const; 

      /** 
      * Retrieves the global transformation matrix. The global transformation matrix is used 
      * to transform coordinates from object space to world space. 
      * 
      * @return The global transformation matrix 
      */ 
      const glm::mat4x4 &GetGlobalTransformation() const; 

      /** 
      * Retrieves the parent object of this object. 
      * 
      * @param The parent object of this object or NULL if this object has no parent 
      */ 
      SceneObject *GetParent() const; 

      /** 
      * Retrieves the position of this object, i.e. the translation component of the 
      * transformation matrix. 
      * 
      * @return The position of the object 
      */ 
      const glm::vec3 GetPosition() const; 

      /** 
      * Retrieves the transformation matrix. The transformation matrix is used to transform 
      * coordinates from object space to the object space of the parent object (or world 
      * space if this object has no parent). 
      * 
      * @return The transformation matrix 
      */ 
      const glm::mat4x4 &GetTransformation() const; 

      /** 
      * Checks whether this instance is of the given type. 
      * 
      * @param type The type to check against 
      * @return true if this object is of type type, false otherwise 
      */ 
      virtual bool IsInstanceOf(SceneObjectType type) const = 0; 

      /** 
      * Sets the global transformation matrix. The global transformation matrix is used 
      * to transform coordinates from object space to world space. 
      * 
      * @param transformation The new global transformation matrix 
      */ 
      void SetGlobalTransformation(const glm::mat4x4 &transformation); 

      /** 
      * Sets the position of this object, i.e. the translation component of the 
      * transformation matrix. 
      * 
      * @param position The new position 
      */ 
      void SetPosition(const glm::vec3 &position); 

      /** 
      * Sets the transformation matrix. The transformation matrix is used to transform 
      * coordinates from object space to the object space of the parent object (or world 
      * space if this object has no parent). 
      * 
      * @param transformation The new transformation matrix 
      */ 
      void SetTransformation(const glm::mat4x4 &transformation); 

      void ChildRemove(SceneObject * child); 
     }; 
    } 
} 

#endif // RAYTRACER_SCENES_SCENEOBJECT_H 

答えて

0

つまり、親球に子球を向ける方法が必要です。

親から子の位置を引いて(親の中心を示すY軸を得るために)、子の新しいY軸の方向を計算し、正規化します。新しいY軸ベクトルを既存のZ軸ベクトル(左手系のシステム)と交差させて新しいX軸を計算し、同じ方向または正反対の方向を指している場合に注意してください(おそらく、エラー)。次に、この新しいX軸ベクトルを新しいY軸ベクトルと交差させて、新しいZ軸ベクトルを取得します。子供のためのあなたの向きのマトリックスにこれを保管してください。

関連する問題