![]() |
псевдо 3D - как сделать освещение?
здравствуйте ещё раз. Развивая тему 3Д решил попробовать сделать ещё освещение.
как я полагаю делается за счёт поиска угла между вектором нормали к плоскости и вектором самого света... посему вопрос - как найти нормаль к плоскости в пространсвте? единственное до чего додумался это что можно получить гломальную матрицу с помощью getRelativeMatrix3D а что дальше с ней делать - ума не приложу :( ведь чтобы получить хотя бы нормаль с помощью Vector3D.crossProduct - надо знать 2 вектора лежащие на плоскости. а может вообще есть способ по проще, организовать затемнение или засветление объекта? |
>>Развивая тему 3Д решил попробовать сделать ещё освещение.
Правильно. Делать можно так: Брать желательно среднюю точку грани, или если объект разбит на мелкие грани любую точку грани. В общем Код:
var грань:Vector3D = new Vector3D(100,100,100);Суммируя выше сказанное эффект 0, отсюда следует, что данный способ не подходит. Легче всего не напрячь процессор и получить красиво задумманое это просто сделать интервал дистанци для каждого объекта в отдельности и нафик этот свет, если он так далеко, то можно сделаь свет слева, свет справа или свет спереди или сзади. В общем вот пример простого самодельного света. (свет спереди нагрузка на проц минимум) http://www.murmadillo.tut.su/html/4cube.html >>посему вопрос - как найти нормаль к плоскости в пространсвте? >>ведь чтобы получить хотя бы нормаль с помощью Vector3D.crossProduct - надо знать 2 вектора лежащие на плоскости. Ну так вы их знаете первый вектор это ваш свет, а второй это ваша плоскость. |
сслка что то у меня неработает
на самом деле всё что я имею это Matrix3D объекта и вот как используя её получить вектор нормали плоскости, чтобы потом получить угол между этой нормали и вектором падения света - тогда по углу можно ставить коэфициент освещения. в общем всё сводится к тому - как найти вектор нормали к плоскости по её Matrix3D. |
Вложений: 2
>>в общем всё сводится к тому - как найти вектор нормали к плоскости по её Matrix3D.
Никак. Matrix3D - это просто преобразования к плоскости можно и к вектору матрицу применить. сслка что то у меня неработает А я не удивляюсь, это ж бесплатный хостинг, я и платный юзал, то-же самое бывает что он не работает. |
Цитата:
Да и вектор, который свет, не подходит, потому что он не лежит на освещаемой плоскости. DRAGOnoid А зачем тебе плоскость освещать? Треугольников у тебя разве нету? Цитата:
А вобще данных мало... Откуда у тебя плоскость, если ты не знаешь её нормали. И как ты применяешь трансформации к плоскости если у тебя, опять же, нету её нормали? Это ж невозможно =) |
>>Как это плоскость может быть вектором? О_о
А почему плоскости не быть вектором. Вы ж представляете себе плоскость. Это такая плоская здоровенная штуковина которая может лежать на трех точках одновременно. У первой точки могут быть координаты (100,0,0) у второй (0,100,0) и третья (0,0,100). Те. это вектор (100,100,100). Таким образом можно одним вектором описать любую плоскость. И найти методом Код:
crossProduct(a:Vector3D):Vector3D |
плоскость я вращаю за счёт встроенных вращений во флеше типа rotationY
как применить к Vector3D - Matrix3D ? |
Есть такое понятие: плоскость, и есть такое понятие: вектор; вектор != плоскость, это факт :)
По поводу самодельных трехмерных движков, есть такая книга http://www.ozon.ru/context/detail/id/1692806/ - вариант для C, но там очень много теоретического материала по созданию, освещению и текстурированию 3d моделей - автор свое дело знает :) |
Какая куча бреда в отдельно взятой теме.
Плоскость можно задать многими способами, один из них это нормаль(вектор) и оффсет(число). Как я понял вы хотите сделать освещение по Ламберту — каждая грань будет освещена равномерна по всей площади, свет имеет направление, но не имеет координаты. Тогда формула освещенности для каждой грани будет такой: Код:
intensity = dot(normal, light) + ambientКод AS3:
|
>>как применить к Vector3D - Matrix3D ?
Да, мой исходничек не смотрели, ладно, я сейчас сам посмотрю, кстати по свой же ссылке Код:
_pVec = mat3D.transformVector(_pVec);Код:
//работает только красный (для примера)Смотрел варианты для С или С++. Флеш им не конкурент. Ибо большая чать, того что мы тут пытаемся сделать внедрена в видуху в виде OpenGl и тени и свет и сортировка граней и многое прочее выполняется в видеокарте, и там ничего химичить не надо - оно идет само собой. Так что С пока пусть полежит в сторонке. |
Цитата:
|
Alex Lexcuk, я скажу вам печальную весть, мужайтесь — у вас поражен мозг. Да, да я точно знаю (я смотрел Доктора Хауса).
Да, Си и Си++ имеют аппаратную поддержку многих вещей, но это не значит, что некоторые алгоритмы не подходят и для флеш (все-таки аппаратная подержка была не всегда), здесь сложно придумать что-то свое, лучшее. Не люблю цепляться к словам, но не говорите того, чего не знаете. Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
|
>>внедрена в видуху в виде OpenGl
Чего вы спорите??? На столе лежит книжеца (старая) и в ней написано: Быстродейтвие программ использующих OpenGL, существенно зависит от видеоадаптера. Аппаратная реализация всех базовых функций OpenGL - залог высокого быстродействия. Драйвер для видеокарты конечно должен быть установлен, как-же без него-то. У меня когда я эту книгу читал был Пентиум 233Мгц и видуха с 1.5 мГб памяти - OpenGL работал. http://www.murmadillo.tut.su/m/Snap2.jpg и сортировка граней >>Сортируют в редких случаях (прозрачные объекты, различные оптимизации) ито на процессоре. Ну это вы уже погнали волну... >>и тени >>Стандартного (обобщеного) алгоритма построения теней нет. Тени уже есть... Где-то видал как их делать (но, забыл). Можно почитать и узнать. http://gamedev.ru/articles/?id=20121 В общем все работает само-собой вот затестил только что. Код полностью непригодный для флеша Код:
//------------(c) Copyright Порев В.Н------------- |
Цитата:
Фраза в книжке правильная. Но из неё не следует, что любая видеокарта поддерживает OpenGL. Конкретно ваша полутораметровая видеокарта, почти наверняка, работала в программном режиме (рассчёт производился центральным процессором). |
Цитата:
Цитата:
|
Цитата:
По крайней мере, когда я сам писал программный рендер (не по делу, а из научного любопытства), я не смог обойтись без сортировки даже в простейших случаях. |
Если есть z-буффер, сортировка не нужна. В z-буффер можно рисовать полигоны в любом порядке, результат всегда будет один. Перед отрисовкой отсекаются повернутые задом к экрану полигоны, во время отрисовки отсекаются части за экраном. Затем происходит проверка по z-буфферу.
|
Цитата:
|
2 DRAGOnoid: матрица преобразования содержит координаты нормали, т.к. состоит она из проекций ортов i,j,k мувика на глобальный stage. MovieClip к этим ортам жестко привязан и лежит всегда в плоскости ij, следовательно нормаль к нему = k, а k - это третья строчка матрицы преобразования, т.е, учитывая что матрица имеет размеры 4x4:
Код AS3:
|
Цитата:
кстати Z буффер бы флешу реально бы не помешал так как сортировать там 3 плоскости образующие тип рельсы - крааайе проблемотично. |
После задания scale'ов длина вектора будет неправильной.
|
я склоняюсь к мысли, что если это и произойдет то оч. нескоро т.к. введение сортировки по глубине (или z-буфера или любого другого способа определения очередности отрисовки) отменит слои (и глубины) в flash IDE что превратит редактор в мини-3dmax с последующей эволюцией в 3dmax, видимо поэтому 3д в 10-ке называют "3д трансформациями"
П.С.: в принципе z-буфер во флэше сделать можно, даже на as2 http://www.free-lance.ru/users/rfc/v...p?prjid=805813 Добавлено через 1 минуту 2 Яски: главное не длина - главное направление. |
ну и направление тоже, если скалировать по осям по-разному.
Где-то видел движок с z-буффером, с графикой типа кваки первой. |
Z-буфер сделать очень легко, даже по сравнению с простейшей сортировкой полигонов. Но без аппаратного ускорения он будет работать медленно, тем более если растеризатор написан на интерпретируемом языке.
|
2 VVall: ну с чего ты взял? квака2 на p233 без аппаратной поддержки летает вполне сносно и там есть z-буфер.
Цитата:
|
Цитата:
Цитата:
|
Цитата:
Цитата:
|
| Часовой пояс GMT +4, время: 04:08. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.