Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ 3d

Автор: stefi78 24.04.2006 21:53

Помогите пожалуйста , пирамиду нарисовала smile.gif она вертится smile.gif ,но должна отбрасывать тень unsure.gif wacko.gif и с тенью проблемы

Program laba1;
uses
Graph,Crt;

type
pyram=array[1..5] of record x,y,z,v:real end;

{verts-Є®®а¤Ё­ вл (xyz) ўҐаиЁ­ дЁЈгал}
const
verts:pyram=(
(x: 0 ; y: 0; z: 40; v:1), {1-п ўҐаиЁ­ }
(x: 40; y: 0; z: 0; v:1), {2}
(x: 0 ; y: 0; z: -40; v:1), {3}
(x:-40; y: 0; z: 0; v:1), {4}
(x: 0; y: - 90; z: 0; v:1) );{5}
var
c: char;
Gd, Gm,i,yt : Integer; {ѓа дЁЄ }

procedure DrawPyrS(c,xt,yt:Integer);
var
i,midX,midY:Integer;
c1: byte;
ver:array[1..5] of PointType;
begin
midX:= GetMaxX div 2;
midY:= GetMaxY div 2;
for i:=1 to 5 do
begin
ver[i].x:=round(verts[i].x)+Xt+midX;
ver[i].y:=round(verts[i].y)+Yt+midY;
end;
SetColor( c );
Line(ver[1].x, ver[1].y , ver[2].x, ver[2].y);
Line(ver[1].x, ver[1].y , ver[4].x, ver[4].y);
Line(ver[1].x, ver[1].y , ver[5].x, ver[5].y);
Line(ver[2].x, ver[2].y , ver[3].x, ver[3].y);
Line(ver[2].x, ver[2].y , ver[5].x, ver[5].y);
Line(ver[3].x, ver[3].y , ver[4].x, ver[4].y);
Line(ver[3].x, ver[3].y , ver[5].x, ver[5].y);
Line(ver[4].x, ver[4].y , ver[ 5].x, ver[5].y);

end;


Procedure rotTxYz(a: Real; S: Real);{ўа 饭ЁҐ ў®ЄагЈ XYZ + Zoom}
Var
ca,sa,y1,x1,z1: Real;
i: Integer;
begin
for i:=1 to 5 do
begin
ca:=cos(a);
sa:=sin(a);
x1:= verts[i].x*ca*ca + verts[i].y*sa*ca + verts[i].z*sa;
y1:= verts[i].x*((-sa)*ca-ca*sa*sa) + verts[i].y*(ca*ca-sa*sa*sa) + verts[i].z*ca*sa;
z1:= verts[i].x*(sa*sa-ca*sa*ca) + verts[i].y*((-ca)*sa-sa*sa*ca) + verts[i].z*ca*ca;
verts[i].x:=x1*S;
verts[i].y:=y1*S;
verts[i].z:=z1*S;
end
end;

begin
{€­ЁжЁ «Ё§ жЁп Ја дЁЄЁ}
Gd:= Detect;
InitGraph(Gd, Gm, 'D:\progra~1\tp\BGI'); { Џгвм Є BGI ¤а ©ўҐа ¬ }
if GraphResult <> grOk then
Halt;
{ђЁб®ў ­ЁҐ}
yt:=-170;
repeat
for i:=1 to 50
do begin
drawpyrS(2,0,yt);
Delay(10000);
drawpyrS(0,0,yt);
rotTxYz(0.05,1.015);
yt:=yt+6
end;
for i:=1 to 50
do begin
drawpyrS(2,0,yt);
Delay(10000);
drawpyrS(0,0,yt);
rotTxYz(0.05,0.985);
yt:=yt-6
end


until Keypressed;
CloseGraph;
end.


выход esc когда пирамида находится в верхней точке

stefi78, с тегами лучше смотрится, правда? wink.gif

Автор: volvo 24.04.2006 22:08

stefi78, если спроецировать каждую вершину пирамиды на плоскость Z=0 и соединить полученные точки в том же порядке, в котором ты соединяешь вершины при отрисовке пирамиды, ты не получишь контур тени (источник света - НАД пирамидой)?

Кстати, вообще-то сначала я должен был задать вопрос "а где находится источник света?" Куда тени-то нужно отбрасывать?

Автор: Бравый генерал 24.04.2006 22:33

Если прямоугольно проецировать вершины на горизонтальную плоскость (любую плоскость, параллельную плоскости X0Z), то тень будет выглядеть одной линией, так как stefi78 не сделала перспективы, и любая горизонтальная плоскость будет проецироваться на экран в линию. stefi78, делай перспективу - так будет легче, чем мучаться и подгонять тень под нормальный вид!)

Автор: volvo 24.04.2006 22:49

Бравый генерал, я где-то написал слово "прямоугольно"? Разговор шел о проекции. О какой - это другой вопрос...

Автор: Бравый генерал 24.04.2006 23:17

Вообще-то я и не спорил с тобой (и ни с кем-либо еще). (По-моему ты придираешься ко мне). А слово "прямоугольно" я употребил вот почему. Ты сказал:

Цитата
источник света - НАД пирамидой

На каком расстоянии? Слишком маленьким это расстояние быть не может, потому что источнику света пришлось бы постоянно двигаться за пирамидой, чтобы быть над ней. Значит ты имел ввиду "довольно высоко над пирамидой", а это - ПОЧТИ (если пренебречь маленьким углом) прямоугольная проекция. Ну что ж - я исправил предыдущий свой пост, раз это имело такое большое значение.

Автор: stefi78 24.04.2006 23:49

ИСТОЧНИК СВЕТА ПЕРЕД ПИРАМИДОЙ

Т.Е. ГЛАЗА (ЧЕЛОВЕКА КОТОРЫЙ СМОТРИТ НА ЭКРАН) ЯВЛЯЮТСЯ ЛАМПОЙ

Автор: Бравый генерал 25.04.2006 0:24

Ага, т.е. тень вроде как на стену падает, да? Если тебе не срочно, то я напишу или сегодня ночью или завтра утром эту прогу, только немного по-другому, по своему (у тебя код немного неудобный)! (Мне самому интересно)

P.S. Здесь прямоугольную проекцию сделать легче всего, но она будет полезной (и то, совсем немного, так как тень будет лишь немного отступать от изображения пирамиды) только при наличии перспективы. Так что нужно брать за источник света точку, коей является центр экрана и оттуда проводить во все вершины лучи до пересечения со стеной.

Автор: stefi78 25.04.2006 4:00

если сделаешь буду благодарна
в паскале я еще тот спец lol.gif wacko.gif norespect.gif
если питерский с меня пиво

Автор: lapp 25.04.2006 8:16

Цитата(stefi78 @ 24.04.2006 19:49) *

ИСТОЧНИК СВЕТА ПЕРЕД ПИРАМИДОЙ

Т.Е. ГЛАЗА (ЧЕЛОВЕКА КОТОРЫЙ СМОТРИТ НА ЭКРАН) ЯВЛЯЮТСЯ ЛАМПОЙ

stefi78, если источник света действительно находится в точке, из которой смотрят (предполагается, по-видимому, что глаз один), то смотрящий никогда не увидит тени. Независимо от того, какая поверхность сзади - стена, лес - тень всегда будет загорожена самим предметом. Нужно это пояснять или понятно и так?
Кроме того, обычно проще (по крайней мере для начала) иметь бесконечно удаленный источник света. Тогда лучи от него будут параллельны друг другу, и нужно задать только угол их падения. Такая ситуация совершенно реальна - например, именно так устроена тень в солнечном свете.

Далее, кроме источника света, нужно задать поверхность, на которую падает тень. Если такой поверхностью является, грубо говоря, земля (пол), и Солнце светит точно из зенита, то тенью будет являться простая проекция пирамиды на плоскость z=0, то есть достаточно занулить вертикальную координату, и ты получишь тень. Но тут есть одно "но", про которое уже упоминал Бравый генерал. А именно: вся тень выродится в линию, так как горизонтальная плоскость строго перпендикулярна экрану и все ее изображение есть одна линия. Чтобы увидеть ее - Бравый генерал прав - надо вводить перспективу. Но это тема для отдельного разговора..

Мудрено я выражаюсь?.. Спрашивай, если что непонятно. smile.gif

Автор: Бравый генерал 26.04.2006 0:09

Цитата
stefi78, если источник света действительно находится в точке, из которой смотрят (предполагается, по-видимому, что глаз один), то смотрящий никогда не увидит тени. Независимо от того, какая поверхность сзади - стена, лес - тень всегда будет загорожена самим предметом.


Ну, имелось наверно ввиду, что источник света - это точка, которая находится в центре монитора, а глаза человека, т.е. камера - это весь монитор. Да, из любой точки тени центр монитора виден не будет smile.gif Но другие участки монитора будут видны, следовательно и на мониторе будет отображаться тень. Вот простенькая схема, показывающая что тень, хоть и не вся, но на мониторе будет видна.


Эскизы прикрепленных изображений
Прикрепленное изображение

Автор: lapp 26.04.2006 7:56

Цитата(Бравый генерал @ 25.04.2006 20:09) *

Ну, имелось наверно ввиду, что источник света - это точка, которая находится в центре монитора, а глаза человека, т.е. камера - это весь монитор. Да, из любой точки тени центр монитора виден не будет smile.gif Но другие участки монитора будут видны, следовательно и на мониторе будет отображаться тень. Вот простенькая схема, показывающая что тень, хоть и не вся, но на мониторе будет видна.

Бравый генерал, глаза человека не могут быть всем монитором. Ты несколько путаешь понятия. Давай разберемся.

Возьмем твою схему. Я не сразу понял, что есть что. Слово "Перспектива" вообще вводит в замешательство. Но потом я, кажется, понял, что ты хочешь сказать. Сейчас я выскажу свои соображения, а ты потом скажи, если с чем-то не согласен.

1. Глаз (или объектив) - это точка (точечный, малый объект). Лучи, ведущие к нему (или от него, что одно и то же), толжны все сходится на входе в глаз. Возможна, правда, ситуация, когда лучи параллельны (или почти параллельны), но она означает, что глаз просто находится бесконечно (или очень) далеко.

2. Я достроил твою схему, чтобы показать, что она на самом деле изображает (мои добавления все зеленые). Я так понял, что две боковые пунктирные линии ограничивают поле зрения. Таким образом, они должны являться продолжениями лучей, исходящих из глаза. Я продолжил их до пересечения.

3. Красные линии, по всей видимости, тоже направлены на глаз (ибо они показывают как видна тень). Таким образом, они тоже должны приходить в глаз.

4. В результате мы видим, что твоя схема неявно подразумевает, что глаз находится на некотором расстоянии от экрана (как, собственно, и есть на самом деле). Если источник света расположить как на твоей схеме, то тень действительно получается видна - она как бы вылезает за края предмета.

Прикрепленное изображение

Ты видишь разницу? stefi78 сказала: "Т.Е. ГЛАЗА (ЧЕЛОВЕКА КОТОРЫЙ СМОТРИТ НА ЭКРАН) ЯВЛЯЮТСЯ ЛАМПОЙ". И я отвечал ей в полном соответствии с ее словами. Если она имел в виду что-то другое - ну, это так и осталось в ее виду.. smile.gif А ответ на ее слова - он один. Любой может провести эксперимент: берешь фонарик, подносишь его как можно ближе к глазу (второй глаз закрыт) - и ты увидишь, что теней нету! Ну, с той точностью, с которой можно поднести фонарь к глазу. Да даже и экспериментировать не нужно - берешь любое фото, сделанное камерой (желательно мыльницей, они маленькие) со встроенной вспышкой. И увидишь, что тень едва видна черным контуром по краю человека, стоящего у стены. Этот черный контур - это результат того, что вспышка все же немного отнесена от объектива. В идеале тени не было бы вообще. Можно и продолжить эксперимент - вынести фонарик на вытянутой руке вперед, по центральному лучу зрения, и ты увидишь, что тень начала вылезать за края - в точности та ситуация, что на твоей схеме.

Конечно, можно додумать за stefi78, расположить источник и стену как надо и преподнести ей на блюдечке, но только указать на ошибки все же я считаю необходимым. Не знаю уж, нужно ли это ей.. Но я априори считаю человека который обратился сюда (а не в "задачи на заказ"), желающим обрести не только решение, но и понимание. Тема построения изображения и перспективы - это очень интересно. Она очень важна для художников и фотографов, но мало кто из них реально понимает оптику этого дела, даже лучшие из них действуют в сложных случаях по интуиции. В свое время я специально занимался этим вопросом (когда пытался немного рисовать) и открыл массу интересного (даже чисто в геометрической перспективе, я не беру сейчас в расчет психику восприятия, что тоже важно для художника).

Автор: Бравый генерал 26.04.2006 19:11

Аааа.... Я понял, что ты имеешь ввиду. Да, ты рассуждаешь абсолютно правильно! Просто я считал монитор и камерой и глазами человека, и туда же источник света помещал. Да, если расположить источник света в точке, где расположены настоящие глаза человека (немного абсурдно звучит smile.gif), т.е. ЗА монитором, то тени не будет видно.

Автор: Бравый генерал 26.04.2006 22:47

Сделал наконец. Прикрепляю архив. В архиве в папке две папки "bad" и "cool". "bad" сделано под стандартным EgaVga.bgi - и пирамида и тень контурами (смотрится не очень). В "cool" сделал полигонами, и с освещением, но под VESA256 smile.gif Engine3D - модуль для работы с 3D. В обоих папках он почти одинаков - единственное отличие - в папке "bad":

Uses
Graph;
А в папке "cool":
Uses
VGraph;

smile.gif
В разделе описания констант "d = 500" - z-координата вертикальной стены.

Управление:
w, s, a, d, ctrl+a, ctrl+d - вращательное движение пирамиды
i, k, j, l, ctrl+i, ctrl+k - поступательное...
ESC - выход

Комментарии еще не делал... Ну, модуль прост в освоении, я думаю (там только обработка вершин и полигонов).


Прикрепленные файлы
Прикрепленный файл  piramida.rar ( 141.19 килобайт ) Кол-во скачиваний: 244

Автор: Jorik 27.04.2006 17:16

А можно узнать, где взять VESA.TPU? А то пишет Error 15: File not found (VESA.TPU).
Вы же дали VESA256... 10.gif

Автор: Бравый генерал 27.04.2006 18:40

А, точно! Просто у меня там в корне и Vesa.tpu, и Vesa2.tpu, и Vesa256.tpu - уже не помню что к чему))) Вот, пожалуйста.


Прикрепленные файлы
Прикрепленный файл  VESA.rar ( 2.81 килобайт ) Кол-во скачиваний: 228

Автор: Гость 28.04.2006 12:44

Прикольные картинки получаются! Только вот попробовал скомпилить - выводится сообщение

Цитата
Error 70: Unit version mismaych (VGraph)

Почему так?

Автор: stefi78 7.05.2006 19:24

СПАСИБО ОГРОМНОЕ!!! за помощь give_rose.gif give_rose.gif give_rose.gif

к сожелению не было возможности выйти в инет и не смогла дать пояснения, но к счастью додумали за меня и абсалютно правельно