2016-09-07 12 views
2

.objファイルから3Dオブジェクトを読み込み、特定のサイズにスケーリングするために、スケーリングと移動よりも行列の変更が望ましい各ベクトル)。 .obj解析関数から、オブジェクトの境界ボックスの幅、高さ、奥行き、中心を知ることができます。OpenGLを使って3Dオブジェクトをスケーリングして移動する

(-1.0,0,1.0)から(1.0,0,1.0)までのタイルのマップがあり、すべてのものをモデリングするために、キューブのobjファイル(長さ40.0)。明らかに、キューブを印刷する前に、キューブのサイズを変更する必要がありました。

私の問題は、z軸上でキューブを正しく動かすことができないということです。 スケーリングはこのように行った:

model.Scale(xn * x_unit/model.GetWidth(), yn * y_unit/model.GetHeight(), zn * z_unit/model.GetDepth()); 
XN、YNおよびZnキューブは、各軸とx_unit、y_unit内に伸びるであろうタイルの量であるとz_unitがその軸の各タイルの長さ

(このこの関数は、私が立方体の中心部を想定し、各軸における平行移動量は(0である計算所望の場所にキューブを移動するためには)完全に

に動作します0、0):

x_trans = (((xn - (2.0f/x_unit))/2.0f) * model.GetOriginalWidth())/xn; 
y_trans = (0.5f * model.GetOriginalHeight()); 
z_trans = ((zn - (2.0f/z_unit))/2.0f) * model.GetOriginalDepth()/zn; 

とtransalting全モデル:

(ときキューブの

void Graphic3dModelPart::Move(float dx, float dy, float dz) 
{ 
    model_ = glm::translate(model_, glm::vec3(dx, dy, dz)); 
    mvp_ = projection_ * view_ * model_; 
} 

void Graphic3dModelPart::Scale(float sx, float sy, float sz) 
{ 
    model_ *= glm::scale(glm::mat4(), glm::vec3(sx, sy, sz)); 
    mvp_ = projection_ * view_ * model_; 
} 

しかし、問題は、Z軸に何かがうまくいかないということです。

model.Move(x_trans - model.GetX(), y_trans - model.GetY(), z_trans - model.GetZ()); 

移動機能やスケール機能の移動とは、モデル行列ではなく、座標の実際の配列をスケーリング深さは複数のタイルの長さです(x軸とy軸では完全に機能します)。

写真が状況を理解するのに役立つと私に言い聞かせます。

答えて

1

私はついにこの問題を解決しました。 スケーリング方法が行列を変更したばかりなので、オブジェクトの移動は、オブジェクトをどれだけスケーリングしたかに関連している必要があります。

float x_trans, y_trans, z_trans; 

model.Scale(xn * x_unit/model.GetWidth(), yn * y_unit/model.GetHeight(), zn * z_unit/model.GetDepth()); 
model.Move(0.0f - model.GetX()/(xn * x_unit/model.GetOriginalWidth()), 0.0f - model.GetY()/(yn * y_unit/model.GetOriginalHeight()), 0.0f - model.GetZ()/(zn * z_unit/model.GetOriginalDepth())); 

x_trans = (((xn - (2.0f/x_unit))/2.0f + x_offset) * model.GetOriginalWidth())/xn; 
y_trans = ((yn/2.0f + y_offset) * model.GetOriginalHeight())/yn; 
z_trans = (((zn - (2.0f/z_unit))/2.0f + z_offset) * model.GetOriginalDepth())/zn; 

model.Move(x_trans, y_trans, z_trans); 

このコードは完全に機能します。

関連する問題