Компьютерная графика, мультимедиа и игры на Visual C#


Глава Изображение и управление трехмерными объектами в трехмерном пространстве - часть 12


    //Вращаем вокруг оси z,

    //пока линия не окажется в y-z плоскости:

    MatrixIdentity(ref R1);

    D = (float)Math.Sqrt(d1 * d1 + d2 * d2);

    R1[1, 1] = d2 / D; R1[1, 2] = d1 / D;

    R1[2, 1] = -R1[1, 2]; R1[2, 2] = R1[1, 1];

    MatrixIdentity(ref R1i);

    R1i[1, 1] = R1[1, 1]; R1i[1, 2] = -R1[1, 2];

    R1i[2, 1] = -R1[2, 1]; R1i[2, 2] = R1[2, 2];

    //Вращаем вокруг оси x, когда линия будет по оси y:

    MatrixIdentity(ref r2);

    L = (float)Math.Sqrt(d1 * d1 + d2 * d2 + d3 * d3);

    r2[2, 2] = D / L; r2[2, 3] = -d3 / L;

    r2[3, 2] = -r2[2, 3]; r2[3, 3] = r2[2, 2];

    MatrixIdentity(ref R2i);

    R2i[2, 2] = r2[2, 2]; R2i[2, 3] = -r2[2, 3];

    R2i[3, 2] = -r2[3, 2]; R2i[3, 3] = r2[3, 3];

    //Вращаем вокруг линии (оси y):

    MatrixYRotate(ref Rot3, theta);

    //Комбинируем матрицы:

    m3MatMultiply(ref M12, ref T, ref R1);

    m3MatMultiply(ref M34, ref r2, ref Rot3);

    m3MatMultiply(ref M1234, ref M12, ref M34);

    m3MatMultiply(ref M56, ref R2i, ref R1i);

    m3MatMultiply(ref M567, ref M56, ref Ti);

    m3MatMultiply(ref M, ref M1234, ref M567);

}

//Строим матрицу преобразования (3-D transformation matrix)

//для переноса на Tx, Ty, Tz:

public void MatrixTranslate(ref float[,] M,

float Tx, float Ty, float Tz)

{

    MatrixIdentity(ref M);

    M[4, 1] = Tx; M[4, 2] = Ty; M[4, 3] = Tz;

}

//Строим матрицу преобразования (3-D transformation matrix)

//для поворота вокруг оси y (угол - в радианах):

public void MatrixYRotate(ref float[,] M, float theta)

{

    MatrixIdentity(ref M);

    M[1, 1] = (float)Math.Cos(theta);

    M[3, 3] = M[1, 1];

    M[3, 1] = (float)Math.Sin(theta);

    M[1, 3] = -M[3, 1];

}

//Применяем матрицу преобразования к точке,

//где матрица не может иметь 0, 0, 0, 1

//в последнем столбце. Нормализуем только

//x и y компоненты результата, чтобы сохранить z информацию:

public void MatrixApplyFull(ref float[] V, ref float[,] M, ref float[] Result)

{

    int i, j; float value = 0;




Начало  Назад  Вперед



Книжный магазин