У меня проблема с написанием альтернативной функции для glRotatef в чистом C. Мне нужно реализовать функцию, аргументы которой: список точек, угол и поворот вектора. Функция должна возвращать список точек после вращения. Моя функция выглядит следующим образом:glRotatef in pure C
void rotate(float * current, float a, float x, float y, float z)
{
float sina = sinf(a);
float cosa = cosf(a);
float rotateMatrix[9] = //creating rotate matrix
{
x*x*(1-cosa) + cosa, x*y*(1-cosa) - z*sina, x*z*(1-cosa) + y*sina,
y*x*(1-cosa) + z*sina, y*y*(1-cosa) + cosa, y*z*(1-cosa) - x*sina,
z*x*(1-cosa) - y*sina, z*y*(1-cosa) + x*sina, z*z*(1-cosa) + cosa
};
float *resultVertexList = current; //temporary help
int i;
for(i=0;current[i] != 0;i++) //multiplying CURRENT_MATRIX * ROTATE_MATRIX
{
int currentVertex = (i/3) * 3;
int rotateColumn = i%3;
resultVertexList[i] =
current[currentVertex] * rotateMatrix[rotateColumn] +
current[currentVertex+1] * rotateMatrix[rotateColumn+3] +
current[currentVertex+2] * rotateMatrix[rotateColumn+6];
}
current = resultVertexList;
}
Я звоню его, как здесь: rotate(current, M_PI/10, 0, 1, 0);
После этого я беру current
список точек и просто нарисовать их с OpenGL. Для тестирования я попытался повернуть список точек, представляющих куб. Он вращается, но при каждом вызове функции rotate
он сжимается. Понятия не имею почему. Смотрите скриншоты:
После многих созывов от rotate
функции она стягивается в одну точку.
Что я делаю неправильно?
Почему бы не использовать glm? http://glm.g-truc.net/0.9.6/index.html – Ryp
glm отлично, но это C++. Несмотря на теги, вопрос говорит «чистый C». Возможно, вопрос может быть выяснен - приемлемо ли C++ или нет? – Justin
чистый C, мне нужно написать эту функцию в сборке x86 сейчас – devPash