-
-
Про управление забыл сказать: WSAD - вперед/назад/сдвиги влево и вправо. QE - сдвиг вверх/вниз SHIFT -ускорение ALT + MOUSE - направление
-
Какой треугольник и что есть плоскость просмотра? Какой сдвиг и почему он есть? Еще и тема про пересечение векторов))
Что всетаки и чем отсечь?
-
У меня только 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;
-
Или нужна пирамида отсечения. В общем я пока не очень силен в этом. Вопрос изучается.
-
Т.е. отсечение плоскостью Zmin камеры? ну тогда этот Zmin надо передать в ClipVec а не тупо чтото там колдовать оперируя толко концами отрезка, не зная про Zmin. Вообще отсечение плоскостью в общем виде - подставляем точки в уравнение плоскости - находим расстояния от точек до плоскости l1 и l2, если расстояния разных знаков - пересечение есть. далее находим t пересечения - l1/(|l1|+|l2|) или l2/(|l1|+|l2|) в зависимости от какой точки строится параметрическое уравнение отрезка
-
|