float sum:
Affine4 tmp:

tmp.set(*this): // tmp copy // копия tmp

for(int с - 0: с < 4; С++)

Приложение В. Некоторые полезные классы и служебные подпрограммы

// form this - tmp * п

// формируем this - tmp * n

for(int г - 0; г <4 : г++)

{
sum - 0:
for(int k - 0: k < 4: k++)

sum +- tmp.m[4 * k + r]* n.m[4 * с + k]: m[4 * с + г] - sum;

}

// end of for loops // конец циклов for

}

// AffineStack methods // методы AffineStack void AffineStack ;: dup() {

AffineNode* tmp - new AffineNode: tmp->affn - new Affine4(*(tos->affn)); tmp->invAffn - new Affine4(*(tos->invAffn)); tmp-[greater]next - tos: tos - tmp:
}
void AffineStack :: setldentityO
// make top item the identity matrix

// делаем верхний элемент единичной матрицей

{
assertUos !- NULL):
tos->affn->setIdentityMatrix():
tos->invAffn->setIdentityMatrix():
}
void AffineStack :: popAndDropO {

if(tos - NULL) return: // do nothing // не делаем ничего

AffineNode *tmp - tos:
tos - tos-[greater]next:
delete tmp;

// should call destructor, which deletes matrices // нужно вызвать деструктор, удаляющий матрицы }

void AffineStack :: releaseAffinesO {

// pop and drop all remaining Items // выталкиваем и отбрасываем все оставшиеся элементы while(tos) popAndDrop():

}
void AffineStack :: rotate(float angle. Vector3 u) {

Affine4 rm: // make identity matrix // создаем единичную матрицу

Affine4 invRm:

u.normalizeO: // make the rotation axis unit length // создаем ось поворота единичной длины

float ang - angle * 3.14159265/ 180: // deg to

// градусы в радианы

float с - cos(ang). s - sin(ang);

float mc - 1.0 - c: // fill the 3x3 upper left matrix -// заполняем 3x3 верхних левых элемента матрицы

rm.m[0] - с + mc * u.x * u.x:

rm.m[l] - mc * u.x * u.y + s * u.z:
rm.m[2] - mc * u.x * u.z - s * u.y;
rm.m[4] - mc * u.y * u.x - s * u.z:

rm.m[5] - с + mc * u.y * u.y;

rm.m[6] - mc * u.y * u.z + s * u.x:
rm.m[8] - mc * u.z * u.x + s * u.y;
rm.m[9] - mc * u.z * u.y - s * u.x;

rm.m[10] - с + mc * u.z * u.z: // same for inverse: just sign of s is changed // то же для обратной: только знак s меняется


⇐ Предыдущая| |Следующая ⇒