Здравствуйте. Прошу помочь. Множество статей оставили в моей голове кашу. Конкретно по теме нашел только на http://www.gamedev.ru/articles/?id=30123&page=2 и то нихрена неосмыслил. Задача: есть плоскость, задана тремя точками полигона, каждая точка соответственно тремя координатами. Есть прямая задана двумя точками (вектор направления камеры). Необходимо найти координаты точки пересечения. Все! Прошу прощения за то, что верчу носом, но мне нужна только формула (всмысле без кода), использующая только исходные данные. Если же не обойтись без уравнения плоскости вида ax+by+cz+d=0, то тогда еще формула для перевода из уравнения плоскости заданной тремя точками в уравнение вида вышеуказанного типа. Как раз с этим переводом у меня и проблемы, справочник по аналитической геометрии в пространстве (вернее 3 справочника) мне не помогли.
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) как-нибудь сам решишь
Спасибо Stiver. Я правда не по твоей подсказке дошел. Но все равно СПАСИБО. Разобрался в конце концов со всей геометрией. Теперь то, конечно, думаю, что как можно было быть таким балбесом. Нашел 2 способа реализации. Один из них воплотил в жизнь. Так, что если кто желает, могу поделиться. Реализовано с помощью математических векторных функций реализованных в D3D. Правда я использовал библиотеку функций MAL из DX SDK уважаемого keYMax-а (vertexland.narod.ru) разрабртанную Kozyr Denis там кстати и исходники. Низкий им поклон.
.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 - точка расположения камеры ; моя реализация определения попала ли эта точка в треугольник довольно сложная ; поэтому без нее, тем более в тему форума это не входит