друзья-товарищи, если куб должен быть залитым, не забудьте позаботиться об удалении не видимых граней, используя при этом метод отброса не лицевых граней. Проверка на то, повернута ли вам грань передом или задом происходит следующим способом:
дана грань с вершинами 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));
|