Конференция "Media" » Пересечение векторов
 
  • dmk © (11.05.17 00:10) [0]
    Всем привет! Подскажите, может кто занимался отсечением векторов?
    Как отсечь треугольник плоскостью просмотра?
    Просто вычитание не вариант. Сдвиг все равно есть.

    Тут картинка: https://hostingkartinok.com/show-image.php?id=f1db28df3c3f873fa45c662ffc2168a5

    Тут EXE (64):
    https://cloud.mail.ru/public/37WQ/kha5qaNLK
  • dmk © (11.05.17 17:48) [1]
    Про управление забыл сказать:
    WSAD - вперед/назад/сдвиги влево и вправо.
    QE - сдвиг вверх/вниз
    SHIFT -ускорение
    ALT + MOUSE - направление
  • zamtmn © (12.05.17 01:22) [2]
    Какой треугольник и что есть плоскость просмотра? Какой сдвиг и почему он есть?
    Еще и тема про пересечение векторов))

    Что всетаки и чем отсечь?
  • dmk © (12.05.17 12:57) [3]
    У меня только 2D отсечение есть. Чтобы корректно нарисовать треугольник его нужно отсечь плоскостью просмотра, т.е. камеры. Сдвиг из-за 2д отсечения. 2д отсекается правильно, но Z не отсекается. Если ZLine рисуется из центра наружу, то отсечение не нужно. Там все в порядке, а если линия рисуется извне, то происходит сдвиг из-за неправильного z0.

    Нашел алгорим с отсечением по t:
    function ClipVec(P0, P1: TVertex): TVertex;
    var
     ZNear: float;
     ZFar: float;
     ClippedLen, Len: float;
     t: float;

    begin
     Len := (P1.z - P0.z);

     if (Len <> 0) then
     begin
       ZFar := MaxFloat(P0.z, P1.z);
       ZNear := MinDist;
       ClippedLen := (ZFar - ZNear);
       t := (ClippedLen / Len);
     end
     else t := 1;

     Result.x := P0.x - (P1.x - P0.x) * t;
     Result.y := P0.y - (P1.y - P0.y) * t;
     Result.z := MinDist;
    end;


    но пока не пашет.

    procedure TZObject.DrawFaces(AColor: TColorRef; dAlpha, dOpacity: byte);
    var
     i: integer;
     i0, i1, i2: TIntPoint;
     v0, v1, v2: TVertex;

    begin
     //Обновим уровень прозрачности
     FBitmap.SetOpacity(dOpacity);

     //Позиция камеры
     cv := FCam.GetView;

     for i := 0 to (FNumTriFaces - 1) do
     begin
       //Индексы лиц + коррекция индекса
       v0 := FPoints[FTriFaces[i].i0 - FStartIndex];
       v1 := FPoints[FTriFaces[i].i1 - FStartIndex];
       v2 := FPoints[FTriFaces[i].i2 - FStartIndex];

       //Вращаем
       v0 := MulVec(v0, FCam.Matrix);
       v1 := MulVec(v1, FCam.Matrix);
       v2 := MulVec(v2, FCam.Matrix);

       //Объекты полностью сзади камеры отбрасываются
       if (v0.z < MinDist) and
          (v1.z < MinDist) and
          (v2.z < MinDist) then Continue else
       //Объекты полностью впереди камеры рисуются
       if (v0.z > MinDist) and
          (v1.z > MinDist) and
          (v2.z > MinDist) then
       begin
         //Проекция точки
         i0 := FCam.ProjectPoint(v0);
         i1 := FCam.ProjectPoint(v1);
         i2 := FCam.ProjectPoint(v2);
         //Закрашиваем треугольник
         FBitmap.FillTriangle(i0.X, i0.Y, i1.X, i1.Y, i2.X, i2.Y, AColor);
       end
       else
       //Объект требует отсечения
       begin
         //<- Сюда нужно отсечение треугольника  
       end;
  • dmk © (12.05.17 12:58) [4]
    Или нужна пирамида отсечения. В общем я пока не очень силен в этом. Вопрос изучается.
  • zamtmn © (12.05.17 21:07) [5]
    Т.е. отсечение плоскостью Zmin камеры? ну тогда этот Zmin надо передать в ClipVec а не тупо чтото там колдовать оперируя толко концами отрезка, не зная про Zmin.
    Вообще отсечение плоскостью в общем виде - подставляем точки в уравнение плоскости - находим расстояния от точек до плоскости l1 и l2, если расстояния разных знаков - пересечение есть. далее находим t пересечения - l1/(|l1|+|l2|) или l2/(|l1|+|l2|) в зависимости от какой точки строится параметрическое уравнение отрезка
  • dmk © (24.05.17 15:42) [6]
 
Конференция "Media" » Пересечение векторов
Есть новые Нет новых   [134427   +37][b:0][p:0]