Мастера DELPHI, Delphi programming community Рейтинг@Mail.ru Титульная страница Поиск, карта сайта Написать письмо 
| Новости |
Новости сайта
Поиск |
Поиск по лучшим сайтам о Delphi
FAQ |
Огромная база часто задаваемых вопросов и, конечно же, ответы к ним ;)
Статьи |
Подборка статей на самые разные темы. Все о DELPHI
Книги |
Новинки книжного рынка
Новости VCL
Обзор свежих компонент со всего мира, по-русски!
|
| Форумы
Здесь вы можете задать свой вопрос и наверняка получите ответ
| ЧАТ |
Место для общения :)
Орешник |
Коллекция курьезных вопросов из форумов
KOL и MCK |
KOL и MCK - Компактные программы на Delphi
Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / rsdn.org

 
Чтобы не потерять эту дискуссию, сделайте закладку « предыдущая ветвь | форум | следующая ветвь »

Пересечение векторов


dmk ©   (11.05.17 00:10

Всем привет! Подскажите, может кто занимался отсечением векторов?
Как отсечь треугольник плоскостью просмотра?
Просто вычитание не вариант. Сдвиг все равно есть.

Тут картинка: 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]

Вроде отсек. Оказалось обычная пропорция.

https://hostingkartinok.com/show-image.php?id=434eaca5d65e33ecaddf2ddc2bd36e4f
https://hostingkartinok.com/show-image.php?id=bedcc0763c6a192768d20aea77f9c380


версия для печати

Написать ответ

Ваше имя (регистрация  E-mail 







Разрешается использование тегов форматирования текста:
<b>жирный</b> <i>наклонный</i> <u>подчеркнутый</u>,
а для выделения текста программ, используйте <code> ... </code>
и не забывайте закрывать теги! </b></i></u></code> :)


Наверх

  Рейтинг@Mail.ru     Титульная страница Поиск, карта сайта Написать письмо