Показать сообщение отдельно
  #11  
Старый 27.06.2011, 00:53
Аватар для Pilot_Red
Pilot_Red Pilot_Red вне форума
Продвинутый
 
Регистрация: 01.11.2006
Адрес: Карелия
Сообщения: 702
Версия Delphi: D7
Репутация: 11581
По умолчанию

друзья-товарищи, если куб должен быть залитым, не забудьте позаботиться об удалении не видимых граней, используя при этом метод отброса не лицевых граней. Проверка на то, повернута ли вам грань передом или задом происходит следующим способом:

дана грань с вершинами V1,V2,V3. Соответственно каждая вершина состоит из координат x,y,z.

находим некоторые коэффициенты.

A=(V2.y-V1.y)*(v3.z-V1.z)-(V2.z-V1.z)*(v3.y-V1.y)
B=(V2.z-V1.z)*(v3.x-V1.x)-(V2.x-V1.x)*(v3.z-V1.z)
C=(V2.x-V1.x)*(v3.y-V1.y)-(V2.y-V1.y)*(v3.x-V1.x)


далее проверяем

если c*focus_kamera+A*V1.x+B*V1.y+C*V1.z<0 то рисуем грань.

focus_kamera это фокусное расстояние, значение которого используется при проекции трехмерных координат на двухмерную плоскость, т.е. на ваш монитор. В основном я его беру равным 250-300
Если грань не нарисуется то поменяйте знак < на >, т.к. там имеет значение то, в каком порядке у вас идет обход граней, либо по часовой стрелке , либо против...
вот собственно нахождение двухмерных координат зная трехмерные

X2D:=(WindowWidth/2+FOCUS_KAMERA*(V.X3D) /(FOCUS_KAMERA+V.Z3DP));
Y2D:=(WindowHeight/2-FOCUS_KAMERA*(V.Y3DP) /(FOCUS_KAMERA+V.Z3DP));
Ответить с цитированием