2016-07-25 16 views
0

私は、プライから図形の輪郭を読み取って回転図を生成しようとしています。私はhereと他の同様のquestioonsから手順を実行しますが、私の問題は解決しません。私は私が上にcilinderをカマラをputh場合、私はこれを取得するだけで2ポイント36 stespsとプライを回転しようとすると:回転点openGL

cilinder ply

rotateメソッドの改正後の私のコードは次のとおりです。

void Figura::rotateY(int ngiros){ 
//Variables de rotacion. 
    //double alfa = 2*M_PI/ngiros; 
    int long_perfil = vertices.size(); 

    vector<_vertex3f> new_vertices; 

    cout << long_perfil << " vertices" << endl; 

    _vertex3f aux1, aux2; 
    for(int i=0; i < ngiros; i++){ 
    double alfa = (2*M_PI/ngiros)*i; 
    for(int j=0; j < long_perfil; j++){ 
     aux1 = vertices.at(j); 
     aux1._0 = (cos(alfa) * aux1._0) + (sin(alfa) * aux1._2); 
     aux1._2 = (cos(alfa) * aux1._2) - (sin(alfa) * aux1._0); 

     vertices.push_back(aux1); 
    } 
    } 

    //vertices.clear(); 
    //vertices = new_vertices; 

    //caras 
    for(int i=0; i < vertices.size(); i++){ 
    _vertex3i aux(i, i+1, i+long_perfil); 
    _vertex3i aux2(i, i+long_perfil+1, i+1); 
    caras.push_back(aux); 
    caras.push_back(aux2); 
    } 
    } 
} 

私のエラーは見つかりませんでした。いくつかの助けが歓迎されるでしょう。

答えて

1

元のカーブがどの座標系にあるのか、どのように回転しているのかがはっきりしないようです。あなたの現在のコードでは、ポイントを可変量だけ回転させるだけですが、それらをすべて同じ平面内に保ちます。あなたはコードを表面的に見るだけで知ることができます:ポイントのy座標の値は決して決して決まらないので、全体の結果は3D形状ではなく、全体的にy = 0平面になります。あなたがしている、ここで

 aux1._0 = (cos(alfa) * aux1._0) + (sin(alfa) * aux1._2); 
    aux1._2 = (cos(alfa) * aux1._2) - (sin(alfa) * aux1._0); 

:パンケーキのようにフラット...あなたは注意する必要がある

もう一つは、あなたはまだ古い値を使用しているときに、値を変更しないことです最初の文ではaux1._0の値を変更しますが、2番目の文では実際には古い値を使用する必要があります。

元の曲線がx/y平面にあり、y軸を中心に回転したいとします。これは素敵な3次元形状をもたらすためには、曲線の全てのX座標が正でなければならない:

^y 
    | 
    |-- 
    | \ 
    | \_ 
    |  | x 
---------------> 
    |  | 
    | /
    | /
    | _/ 
    |/ 

ピクチャ画面の指摘z軸。

ここで、y軸の周りに所定の角度だけアルファこの曲線を回転させるために、我々は、y座標不変のままとするXZ平面内アルファにより点(x、0)を回転させますxとzの新しい値を取得します。形状の入力ポイントの新たな座標(X 'Y'、Z ')(X、Y)を次のとおり

for(int i=0; i < ngiros; i++){ 
    double alfa = (2*M_PI/ngiros)*i; 
    for(int j=0; j < long_perfil; j++){ 
     aux1 = vertices.at(j); 
     aux2._0 = cos(alfa) * aux1._0; 
     aux2._1 = aux1._1; 
     aux2._2 = sin(alfa) * aux1._0; 

     vertices.push_back(aux2); 
    } 
} 
:コードの修正版として

x' = x * cos(alpha) 
y' = y 
z' = x * sin(alpha)