Показать сообщение отдельно
Старый 24.03.2009, 19:54
Яски вне форума Посмотреть профиль Отправить личное сообщение для Яски Найти все сообщения от Яски
  № 9  
Ответить с цитированием
Яски

блогер
Регистрация: May 2008
Адрес: (0, 10, 185) в локальной системе
Сообщений: 721
Записей в блоге: 6
Какая куча бреда в отдельно взятой теме.

Плоскость можно задать многими способами, один из них это нормаль(вектор) и оффсет(число).

Как я понял вы хотите сделать освещение по Ламберту — каждая грань будет освещена равномерна по всей площади, свет имеет направление, но не имеет координаты.
Тогда формула освещенности для каждой грани будет такой:
Код:
   intensity = dot(normal, light) + ambient
    dot — скалярное произведение векторов
    normal — нормаль грани
    light — направление света
    ambient — любое число, значение освещенности "по-умолчанию".
Дальше нам нужно получать нормаль грани. Я, если честно, пока еще не разбирался с работой с 3D в десятке, и, например не знаю, как там расположены оси координат. Вижу пока два способа получения нормали экранного объекта( это вектор перпендикулярный плоскости объекта)
Код AS3:
 //для начала получаем глобальную матрицу
 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;
  // При использовании этого способа экранный объект нельзя масштабировать, иначе результат будет неправильным. Для учета масштабов есть еще один способ.