![]() |
псевдо 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 и тени и свет и сортировка граней и многое прочее выполняется в видеокарте, и там ничего химичить не надо - оно идет само собой. Так что С пока пусть полежит в сторонке. |
| Часовой пояс GMT +4, время: 13:36. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.