IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> 3d, 3d пирамида-тень
сообщение
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 12
Пол: Женский
Реальное имя: Таня

Репутация: -  0  +


Помогите пожалуйста , пирамиду нарисовала 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 -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






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

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


Новичок
*

Группа: Пользователи
Сообщений: 39
Пол: Мужской
Реальное имя: Василий

Репутация: -  -2  +


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

Сообщение отредактировано: Бравый генерал -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






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


Новичок
*

Группа: Пользователи
Сообщений: 39
Пол: Мужской
Реальное имя: Василий

Репутация: -  -2  +


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

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


Новичок
*

Группа: Пользователи
Сообщений: 12
Пол: Женский
Реальное имя: Таня

Репутация: -  0  +


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

Т.Е. ГЛАЗА (ЧЕЛОВЕКА КОТОРЫЙ СМОТРИТ НА ЭКРАН) ЯВЛЯЮТСЯ ЛАМПОЙ
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Новичок
*

Группа: Пользователи
Сообщений: 39
Пол: Мужской
Реальное имя: Василий

Репутация: -  -2  +


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

P.S. Здесь прямоугольную проекцию сделать легче всего, но она будет полезной (и то, совсем немного, так как тень будет лишь немного отступать от изображения пирамиды) только при наличии перспективы. Так что нужно брать за источник света точку, коей является центр экрана и оттуда проводить во все вершины лучи до пересечения со стеной.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Новичок
*

Группа: Пользователи
Сообщений: 12
Пол: Женский
Реальное имя: Таня

Репутация: -  0  +


если сделаешь буду благодарна
в паскале я еще тот спец lol.gif wacko.gif norespect.gif
если питерский с меня пиво
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


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

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

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

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

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

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


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Новичок
*

Группа: Пользователи
Сообщений: 39
Пол: Мужской
Реальное имя: Василий

Репутация: -  -2  +


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


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


Эскизы прикрепленных изображений
Прикрепленное изображение
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


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

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

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

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

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

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

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

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

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

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

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

Сообщение отредактировано: lapp -


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12


Новичок
*

Группа: Пользователи
Сообщений: 39
Пол: Мужской
Реальное имя: Василий

Репутация: -  -2  +


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


Новичок
*

Группа: Пользователи
Сообщений: 39
Пол: Мужской
Реальное имя: Василий

Репутация: -  -2  +


Сделал наконец. Прикрепляю архив. В архиве в папке две папки "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 - выход

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

Сообщение отредактировано: volvo -


Прикрепленные файлы
Прикрепленный файл  piramida.rar ( 141.19 килобайт ) Кол-во скачиваний: 111
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #14





Группа: Пользователи
Сообщений: 4
Пол: Мужской
Реальное имя: Андрей

Репутация: -  0  +


А можно узнать, где взять VESA.TPU? А то пишет Error 15: File not found (VESA.TPU).
Вы же дали VESA256... 10.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #15


Новичок
*

Группа: Пользователи
Сообщений: 39
Пол: Мужской
Реальное имя: Василий

Репутация: -  -2  +


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


Прикрепленные файлы
Прикрепленный файл  VESA.rar ( 2.81 килобайт ) Кол-во скачиваний: 108
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #16


Гость






Прикольные картинки получаются! Только вот попробовал скомпилить - выводится сообщение
Цитата
Error 70: Unit version mismaych (VGraph)

Почему так?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #17


Новичок
*

Группа: Пользователи
Сообщений: 12
Пол: Женский
Реальное имя: Таня

Репутация: -  0  +


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

к сожелению не было возможности выйти в инет и не смогла дать пояснения, но к счастью додумали за меня и абсалютно правельно
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 




- Текстовая версия 18.10.2017 3:34
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"