Координаты пересечения прямой и плоскости

Тема в разделе "WASM.GRAPHICS", создана пользователем melnik_sergey, 7 мар 2005.

  1. melnik_sergey

    melnik_sergey New Member

    Публикаций:
    0
    Регистрация:
    23 авг 2004
    Сообщения:
    11
    Здравствуйте.

    Прошу помочь. Множество статей оставили в моей голове кашу. Конкретно по теме нашел только на http://www.gamedev.ru/articles/?id=30123&page=2 и то нихрена неосмыслил.

    Задача: есть плоскость, задана тремя точками полигона, каждая точка соответственно тремя координатами. Есть прямая задана двумя точками (вектор направления камеры).

    Необходимо найти координаты точки пересечения. Все!

    Прошу прощения за то, что верчу носом, но мне нужна только формула (всмысле без кода), использующая

    только исходные данные. Если же не обойтись без уравнения плоскости вида ax+by+cz+d=0,

    то тогда еще формула для перевода из уравнения плоскости заданной тремя точками в уравнение вида вышеуказанного типа. Как раз с этим переводом у меня и проблемы, справочник по аналитической геометрии в пространстве (вернее 3 справочника) мне не помогли.
     
  2. Stiver

    Stiver Партизан дзена

    Публикаций:
    0
    Регистрация:
    18 дек 2004
    Сообщения:
    812
    Адрес:
    Germany
    melnik_sergey





    Ох не верю.. :)



    Точки плоскости: (x<sub>i</sub>,y<sub>i</sub>,z<sub>i</sub>) i=1,2,3



    Точки прямой: (a<sub>i</sub>,b<sub>i</sub>,c<sub>i</sub>) i=1,2



    Уравнение:

    (x<sub>1</sub>,y<sub>1</sub>,z<sub>1</sub>)+k(x<sub>2</sub>-x<sub>1</sub>,y<sub>2</sub>-y<sub>1</sub>,z<sub>2</sub>-z<sub>1</sub>)+m(x<sub>3</sub>-x<sub>1</sub>,y<sub>3</sub>-y<sub>1</sub>,z <sub>3</sub>-z<sub>1</sub>)=(a<sub>1</sub>,b<sub>1</sub>,c<sub>1</sub>)+n(a<sub>2</sub>-a<sub>1</sub>,b<sub>2</sub>-b<sub>1</sub>,c<sub>2</sub>-c<sub>1</sub>)



    Предполагается, что все векторы написаны по вертикали. Систему из трех уравнений с тремя неизвестными (k,m,n) как-нибудь сам решишь ;)
     
  3. melnik_sergey

    melnik_sergey New Member

    Публикаций:
    0
    Регистрация:
    23 авг 2004
    Сообщения:
    11
    Спасибо Stiver.

    Я правда не по твоей подсказке дошел. Но все равно СПАСИБО.



    Разобрался в конце концов со всей геометрией. Теперь то, конечно, думаю, что как можно было быть

    таким балбесом. Нашел 2 способа реализации. Один из них воплотил в жизнь. Так, что если кто желает, могу поделиться. Реализовано с помощью математических векторных функций реализованных в D3D. Правда я использовал библиотеку функций MAL из DX SDK уважаемого

    keYMax-а (vertexland.narod.ru) разрабртанную Kozyr Denis там кстати и исходники.

    Низкий им поклон.
     
  4. melnik_sergey

    melnik_sergey New Member

    Публикаций:
    0
    Регистрация:
    23 авг 2004
    Сообщения:
    11
    .data



    a1 MALVECTOR3 <-10.0f,0.0f,0.0f>

    b1 MALVECTOR3 <10.0f,0.0f,0.0f>

    c1 MALVECTOR3 <0.0f,10.0f,0.0f>

    point_1 dd OFFSET a1 ;Здесь будет лежать смещение для вершин проверяемого треугольника

    point_2 dd OFFSET b1

    point_3 dd OFFSET c1

    .data?

    ; point_1 dd ? ;Здесь будет лежать смещение для вершин проверяемого треугольника

    ; point_2 dd ?

    ; point_3 dd ?

    Numerator dd ? ;сюда вычисляем расстояние от точки камеры до плоскости полигона (перпендикуляр)

    Denominator dd ? ; скалярное произведение векторов нормали ,cos (ab)



    vector_raznosti_1_2 MALVECTOR3 <?> ; эти вектора нам необходимы для нахождения нормали плоскости

    vector_raznosti_1_3 MALVECTOR3 <?>

    normal_vector_poligon MALVECTOR3 <?> ; в этом векторе будет хранится нормаль полигона (плоскости), тоесть значение чисел формулы плоскости А,В,С (ax+by+cz+d=0)

    znachenie_D_dlya_formuly_ploskosti dd ?

    tochka_peresechenia_s_ploskostiu MALVECTOR3 <?>







    .code





    ;;===================================== << расчет попали ли в треугольник



    ;Расчет будет производится путем:

    ; 1. определение координат пересечения прямой (вектора направления камеры) с плоскостью полигона

    ; 1.1 В начале находим два вектора из разности координат полигона

    ; 1.2 Находим векторное произведение векторов для вычисления нормального вектора к полигону (== a,b,c формулы ax+by+cz+d=0)

    ; 1.3 Нормализуем нормальный вектор

    ; 1.4 Находим D (расстояние от начала координат до плоскости) путем подставление чисел в формулу d=-(ax+by+cz) где x,y,z координаты любой точки полигона

    ; 1.5 Находим Numerator(расстояние от точки камеры до плоскости полигона (перпендикуляр))

    ; !!!при условии нормализованного вектора нормали !!! формула приобретает вид расстояние = Ax + By + Cz + D

    ; 1.6 Находим Denominator скалярное произведение векторов нормали плоскости и прямой , !!! а т.к. они еденичны то это у нас значение cos угла между ними {|a|^|b|*cos {ab}}

    ; 1.7 dist = Numerator / Denominator это расстояние от точки камеры до пересечения с плоскостью (длинна гепотинузы треугольника [точка камеры, перпендткуляр на плоскость, точка пересечения прямой и плоскости])

    ; 1.8 находим координаты пересечения путем умножения еденичного вектора направления камеры на dist и прибавление координаты точки камеры

    ; 2. определение попала ли эта точка в треугольник



    mov ESI, point_1 ;В начале находим два вектора из разности координат полигона,

    assume ESI: ptr MALVECTOR3 ; оба они будут лежать в плоскости этого самого полигона и из них будет находится нормальный вектор

    fninit

    fld [esi].z

    fld [esi].y

    fld [esi].x

    fld st(2)

    fld st(2)

    fld st(2)

    mov ESI, point_2

    fsub [esi].x

    fstp vector_raznosti_1_2.x

    fsub [esi].y

    fstp vector_raznosti_1_2.y

    fsub [esi].z

    fstp vector_raznosti_1_2.z



    mov ESI, point_3

    fsub [esi].x

    fstp vector_raznosti_1_3.x

    fsub [esi].y

    fstp vector_raznosti_1_3.y

    fsub [esi].z

    fstp vector_raznosti_1_3.z



    INVOKE MALVec3Cross,ADDR normal_vector_poligon, ADDR vector_raznosti_1_2, ADDR vector_raznosti_1_3 ; Находим векторное произведение векторов для вычисления нормального вектора к полигону

    INVOKE MALVec3Normalize, ADDR normal_vector_poligon, ADDR normal_vector_poligon ; Затем нормализуем его тоесть |v|==1



    mov ESI, point_1

    assume ESI: ptr MALVECTOR3



    fld [esi].x ; ищем d (формулы) d=-(ax+by+cz)

    fmul normal_vector_poligon.x

    fld [esi].y

    fmul normal_vector_poligon.y

    fld [esi].z

    fmul normal_vector_poligon.z

    faddp st(1), st(0)

    faddp st(1), st(0)

    FCHS

    fstp znachenie_D_dlya_formuly_ploskosti ; нашли d (формулы плоскости полигона)



    INVOKE MALVec3Dot, ADDR EyeVector, ADDR normal_vector_poligon

    fadd znachenie_D_dlya_formuly_ploskosti

    FCHS ;приходится менять знак т.к. затем будет найден не внутренний а внешний угол

    fstp Numerator ;нашли расстояние от точки камеры до плоскости полигона



    INVOKE MALVec3Dot, ADDR vector_camera_alfa, ADDR normal_vector_poligon ;==>st(0) нашли скалярное произведение векторов !!! ==0 то, надо делать выход



    fld Numerator

    FXCH

    fdivp st(1),st(0) ; st(0)== DIST



    fld st

    fld st

    fmul vector_camera_alfa.x

    fadd EyeVector.x

    fstp tochka_peresechenia_s_ploskostiu.x

    fmul vector_camera_alfa.y

    fadd EyeVector.y

    fstp tochka_peresechenia_s_ploskostiu.y

    fmul vector_camera_alfa.z

    fadd EyeVector.z

    fstp tochka_peresechenia_s_ploskostiu.z ; все точка пересечения найдена





    ; Здесь vector_camera_alfa еденичный вектор повернутый в сторону куда смотрит камера

    ; EyeVector - точка расположения камеры

    ; моя реализация определения попала ли эта точка в треугольник довольно сложная

    ; поэтому без нее, тем более в тему форума это не входит