2016-07-25 2 views
0

Я пытаюсь генерировать цифры по оборотам, читая профиль фигуры из слоя. Я выполняю шаги от here и других подобных квестой, но моя проблема сохраняется. Когда я пытаюсь повернуть Ply только с 2 точками 36 stesps я получаю это, если я Puth Камара на вершине CILINDER:Повернуть точки openGL

cilinder ply

Мой код после пересмотра метода вращения является:

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-координаты любой из точек, поэтому весь результат не является трехмерной фигурой, а целиком находится в плоскости y = 0. Как плоская, как блин ...

Еще одна вещь, вы должны быть осторожны, о том, что вы не изменять значения, пока вы все еще используете старое значение:

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

Здесь вы изменяя значение aux1._0 в первом утверждении, в то время как второй оператор должен по-прежнему использовать старое значение.

Предположим, что ваша первоначальная кривая находится в плоскости x/y, и вы хотите вращаться вокруг оси y. Для этого, чтобы привести в хороший 3D формы, все х-координаты кривой должны быть положительными:

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

Picture ось г указывая на экране.

Теперь, чтобы повернуть эту кривую на заданный угол альфа- вокруг оси у, мы оставить у-координату неизменной, и вращать точку (х, 0) альфа в пределах плоскости хг в получить новые значения для x и z. Новые координаты (х «у», г ') для ввода точки (х, у) формы затем:

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

В модифицированной версии кода:

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); 
    } 
} 
Смежные вопросы