Отбрасывание нелицивых граней с учетом перспективы

Тема в разделе "WASM.A&O", создана пользователем Aloner, 5 авг 2008.

  1. Aloner

    Aloner New Member

    Публикаций:
    0
    Регистрация:
    11 апр 2008
    Сообщения:
    96
    Есть идея посчитать координаты центра полигона, привязать туда нормаль и корректировать нормаль умножением на W (коэффициент перспективы) этой точки...Только корректно ли это и не медленее чем сам прямой расчет нормали? Надо думать...
     
  2. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Хотя с другой стороны у нас есть нормаль вычисленная для луча который смотрит перпендикулярно экранной плоскости на объект. Если повернуть нормаль на угол между перпендикуляром и объектом, то может и выйдет.
     
  3. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Aloner
    ИМХО одним коэффициентом перспективы не обойдёшся ;)
    Каждой точке 3d пространства (в зависимости от её расстояния от центра экрана {или наблюдателя}) будет соответствовать свой "критический угол" нормали больше которого нормаль знак не меняет, меньше - меняет, а вот как будет выглядеть эта функция - нужно медитировать ;)
     
  4. Aloner

    Aloner New Member

    Публикаций:
    0
    Регистрация:
    11 апр 2008
    Сообщения:
    96
    Вспоминаю, как я в маткаде строил функцию освещения от расстояния при изменении коодинаты Y экранной плоскости для полигона... красиво получилось ))
     
  5. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    То что я написал в 40 посте должно работать, то есть переход от нормали к координате, перспективном преобразовании и снова переход к нормали.
     
  6. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Кажется есть решение - нужно смотреть угол альфа между нормалью и лучём: камера - центр полигона, если альфа < 90° то нормаль сменит знак , если больше то нет, осталось записать это математически и красиво оптимизировать расчёт ;)
     
  7. Aloner

    Aloner New Member

    Публикаций:
    0
    Регистрация:
    11 апр 2008
    Сообщения:
    96
    Что то в этом есть... а поворачивать в сторону точки проекции...
     
  8. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Y_Mur
    Ну да считать угол между лучём и нормалью, вот и тест.
     
  9. Aloner

    Aloner New Member

    Публикаций:
    0
    Регистрация:
    11 апр 2008
    Сообщения:
    96
    Метод вроде верный, но вот оптимизация (если она возможна), нужна полюбому... чего тока просчет луча камера-центр полигона и его нормализация будет стоить...
     
  10. Aloner

    Aloner New Member

    Публикаций:
    0
    Регистрация:
    11 апр 2008
    Сообщения:
    96
    Может нужно ввести вектор который перпендикулярен нормали (т.е. лежит в плоскости)... чет мне вот такое на ум приходит
     
  11. Aloner

    Aloner New Member

    Публикаций:
    0
    Регистрация:
    11 апр 2008
    Сообщения:
    96
    Пока метод пересчета нормали на каждом рендере самый оптимальный... Может просто его попробовать оптимизировать? хотя там вроде и нечего :))
     
  12. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Подумалось, а если у нас будет очень большой угол обзора, практически ортогональная проекция, как тогда алгос с нахождением угла между лучём и нормалью себя будет вести?

    Aloner
    Вообще-то векторное произведение можно довольно нехило оптимизировать под SSE
    http://www.gamedev.ru/articles/?id=70113&page=5

    Но вот с переводом нормали в координату я бы тоже попробовал, хотя может и это не стоит свеч.
     
  13. halyavin

    halyavin New Member

    Публикаций:
    0
    Регистрация:
    13 май 2005
    Сообщения:
    252
    Адрес:
    Russia
    А зачем вы считаете векторное произведение? Вам ведь нужна от него только одна координата (z) - вот ее и считайте. Итого будет 2 умножения.
     
  14. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Цитата из DirectX SDK.
    Значит есть такое пространство.
     
  15. Aloner

    Aloner New Member

    Публикаций:
    0
    Регистрация:
    11 апр 2008
    Сообщения:
    96
    Спасибо!
    Во я топор!!!
    Точно.. я ж сам подчеркивал что мне координата Z только нужна, и в тоже время забыл, и думаю что надо все три считать. Да, действительно всего 2 умножения нужно... Еще раз спасибо, что ткнул:)) Вечно ищу какие то сверх решения, когда вот оно на поверхности все..
     
  16. Aloner

    Aloner New Member

    Публикаций:
    0
    Регистрация:
    11 апр 2008
    Сообщения:
    96
    Млин, рано обрадовался... Работает тоже не корректно... Полигоны лежащие в плоскоти XOZ (плоскость XOY - параллельна наблюдателю) отбрасываются неверно...