|
|
|||||
псевдо 3D - как сделать освещение?
здравствуйте ещё раз. Развивая тему 3Д решил попробовать сделать ещё освещение.
как я полагаю делается за счёт поиска угла между вектором нормали к плоскости и вектором самого света... посему вопрос - как найти нормаль к плоскости в пространсвте? единственное до чего додумался это что можно получить гломальную матрицу с помощью getRelativeMatrix3D а что дальше с ней делать - ума не приложу ведь чтобы получить хотя бы нормаль с помощью Vector3D.crossProduct - надо знать 2 вектора лежащие на плоскости. а может вообще есть способ по проще, организовать затемнение или засветление объекта?
__________________
Black DRAGON хочет кушать Т_Т |
|
|||||
>>Развивая тему 3Д решил попробовать сделать ещё освещение.
Правильно. Делать можно так: Брать желательно среднюю точку грани, или если объект разбит на мелкие грани любую точку грани. В общем var грань:Vector3D = new Vector3D(100,100,100); var солнышко:Vector3D = new Vector3D(1000,1000,1000); var свет:Number = Vector3D.distance(грань,солнышко); Суммируя выше сказанное эффект 0, отсюда следует, что данный способ не подходит. Легче всего не напрячь процессор и получить красиво задумманое это просто сделать интервал дистанци для каждого объекта в отдельности и нафик этот свет, если он так далеко, то можно сделаь свет слева, свет справа или свет спереди или сзади. В общем вот пример простого самодельного света. (свет спереди нагрузка на проц минимум) http://www.murmadillo.tut.su/html/4cube.html >>посему вопрос - как найти нормаль к плоскости в пространсвте? >>ведь чтобы получить хотя бы нормаль с помощью Vector3D.crossProduct - надо знать 2 вектора лежащие на плоскости. Ну так вы их знаете первый вектор это ваш свет, а второй это ваша плоскость. Последний раз редактировалось Alex Lexcuk; 24.03.2009 в 17:19. |
|
|||||
сслка что то у меня неработает
на самом деле всё что я имею это Matrix3D объекта и вот как используя её получить вектор нормали плоскости, чтобы потом получить угол между этой нормали и вектором падения света - тогда по углу можно ставить коэфициент освещения. в общем всё сводится к тому - как найти вектор нормали к плоскости по её Matrix3D.
__________________
Black DRAGON хочет кушать Т_Т |
|
|||||
>>в общем всё сводится к тому - как найти вектор нормали к плоскости по её Matrix3D.
Никак. Matrix3D - это просто преобразования к плоскости можно и к вектору матрицу применить. сслка что то у меня неработает А я не удивляюсь, это ж бесплатный хостинг, я и платный юзал, то-же самое бывает что он не работает. |
|
|||||
Регистрация: Feb 2009
Сообщений: 23
|
Цитата:
Да и вектор, который свет, не подходит, потому что он не лежит на освещаемой плоскости. DRAGOnoid А зачем тебе плоскость освещать? Треугольников у тебя разве нету? Цитата:
А вобще данных мало... Откуда у тебя плоскость, если ты не знаешь её нормали. И как ты применяешь трансформации к плоскости если у тебя, опять же, нету её нормали? Это ж невозможно =) |
|
|||||
>>Как это плоскость может быть вектором? О_о
А почему плоскости не быть вектором. Вы ж представляете себе плоскость. Это такая плоская здоровенная штуковина которая может лежать на трех точках одновременно. У первой точки могут быть координаты (100,0,0) у второй (0,100,0) и третья (0,0,100). Те. это вектор (100,100,100). Таким образом можно одним вектором описать любую плоскость. И найти методом Перпендикуляр к этим плоскостям. Последний раз редактировалось Alex Lexcuk; 24.03.2009 в 18:47. |
|
|||||
плоскость я вращаю за счёт встроенных вращений во флеше типа rotationY
как применить к Vector3D - Matrix3D ?
__________________
Black DRAGON хочет кушать Т_Т |
|
|||||
Регистрация: Jul 2008
Адрес: Украина, Киев
Сообщений: 253
|
Есть такое понятие: плоскость, и есть такое понятие: вектор; вектор != плоскость, это факт
По поводу самодельных трехмерных движков, есть такая книга http://www.ozon.ru/context/detail/id/1692806/ - вариант для C, но там очень много теоретического материала по созданию, освещению и текстурированию 3d моделей - автор свое дело знает |
|
|||||
блогер
Регистрация: May 2008
Адрес: (0, 10, 185) в локальной системе
Сообщений: 721
Записей в блоге: 6
|
Какая куча бреда в отдельно взятой теме.
Плоскость можно задать многими способами, один из них это нормаль(вектор) и оффсет(число). Как я понял вы хотите сделать освещение по Ламберту — каждая грань будет освещена равномерна по всей площади, свет имеет направление, но не имеет координаты. Тогда формула освещенности для каждой грани будет такой: intensity = dot(normal, light) + ambient dot — скалярное произведение векторов normal — нормаль грани light — направление света ambient — любое число, значение освещенности "по-умолчанию". //для начала получаем глобальную матрицу var matrix:Matrix3D = dsp.getRelativeMatrix3D(stage); // Получаем вектор нормали в глобальном пространстве, здесь два варианта — преобразуем из локальных координат одну из осей или получаем компоненты этих векторов прямо из матрицы. // По первому способу, передаем локальную ось z (может правильно будет передавать и другую ось, могу ошибаться, это зависит от конкретной реализации, вобщем ось вверх var normal:Vector3D = matrix.deltaTransformVector(Vector3D.Z_AXIS); // Свет направлен вертикально вниз по оси z const light:Vector3D = new Vector3D(0, 0, -1); var intensity:Number = light.dotProduct(normal) + 0.1; // При использовании этого способа экранный объект нельзя масштабировать, иначе результат будет неправильным. Для учета масштабов есть еще один способ. |
|
|||||
>>как применить к Vector3D - Matrix3D ?
Да, мой исходничек не смотрели, ладно, я сейчас сам посмотрю, кстати по свой же ссылке И вот так считается свет до камеры (по координате Z) красиво и не дорого (экономия процессора) //работает только красный (для примера) public function calcColor(_color:uint,_dist:Array,_index:int):uint{ var color:uint; len = _dist.length; var dMin:Number = _dist[0][0]; var dMax:Number = _dist[len-1][0]; var dStep:Number = Math.abs((dMax - dMin)/len); var rMin:uint = 0x00; var rMax:uint = 0xee; var cStep:Number = Math.abs((rMin-rMax)/len); var r:uint; var g:uint = 0x00; var b:uint = 0x00; var ind:Number = (_dist[_index][0]-dMin)/dStep; r = uint(rMax-cStep*ind); color = ((r & 0xFF) << 16) | ((g & 0xFF) << 8) | (b & 0xFF); return color; } Смотрел варианты для С или С++. Флеш им не конкурент. Ибо большая чать, того что мы тут пытаемся сделать внедрена в видуху в виде OpenGl и тени и свет и сортировка граней и многое прочее выполняется в видеокарте, и там ничего химичить не надо - оно идет само собой. Так что С пока пусть полежит в сторонке. Последний раз редактировалось Alex Lexcuk; 24.03.2009 в 20:22. |
Часовой пояс GMT +4, время: 09:21. |
|
« Предыдущая тема | Следующая тема » |
|
|