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


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


    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(n1 * n1 + n2 * n2 + n3 * n3);

    r2[2, 2] = D / L; r2[2, 3] = -n3 / 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];

    //Рисуем отражение объекта перпендикулярно x-z плоскости:

    MatrixIdentity(ref S); S[2, 2] = -1;

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

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

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

    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);

}

//Строим матрицу преобразования для поворота на угол theta

//вокруг линии, проходящей через (p1, p2, p3)

//в направлении <d1, d2, d3>.

//Угол theta откладывается против часовой стрелки,

//если мы смотрим вниз в направлении,

//противоположном направлению линии:

public void m3LineRotate(ref float[,] M,

float p1, float p2, float p3,

float d1, float d2, float d3, float theta)

{

    float[,] T = new float[5, 5]; //Перенос.

    float[,] R1 = new float[5, 5]; //Вращение 1.

    float[,] r2 = new float[5, 5]; //Вращение 2.

    float[,] Rot3 = new float[5, 5]; //Вращение.

    float[,] R2i = new float[5, 5]; //Стоп вращению 2.

    float[,] R1i = new float[5, 5]; //Стоп вращению 1.

    float[,] Ti = new float[5, 5]; //Стоп переносу.

    float D, L;

    float[,] M12 = new float[5, 5];

    float[,] M34 = new float[5, 5];

    float[,] M1234 = new float[5, 5];

    float[,] M56 = new float[5, 5];

    float[,] M567 = new float[5, 5];

    //Переносим плоскость к началу координат:

    MatrixTranslate(ref T, -p1, -p2, -p3);

    MatrixTranslate(ref Ti, p1, p2, p3);




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



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