Yandersen | Дата: Вс, 06 Май 2012, 18:17 | Сообщение # 1 |
1 Поколение
Группа: Доверенные
Сообщений: 196
Статус: Offline
| Поговорим о ландшафте. Огромная игровая зона требует особого подхода к вопросу о реализации ландшафта. Немало трудностей доставит динамическое изменение ландшафта (терраформинг). Надеюсь, спора не будет насчёт реализации ландшафта - карта высот. Отдельные элементы (пики, гребни гор, обрывы) можно драпировать моделями. Динамический ландшафт подразумевает перерасчёт нормалей. Нормали для карты высот можно вычислять на лету, непосредственно перед отрисовыванием ландшафта, но это будет менее рационально, нежели вычислять их заранее и хранить в отдельном массиве - вычисление каждой нормали требует нормализации вектора, а это не совсем "дешёвая" операция.
[Беженец со Скаев]
|
|
| |
Yandersen | Дата: Вс, 06 Май 2012, 18:43 | Сообщение # 2 |
1 Поколение
Группа: Доверенные
Сообщений: 196
Статус: Offline
| Дабы привнести в топик хоть какую-то полезную информацию, опишу метод вычисления нормалей. Взглянем на участок карты высот: Чтобы вычислить нормаль в центральной вершине, нам понадобятся координаты 4-х соседних (T=Top, L=Left, R=Right, B=Bottom). Нормаль к центральной вершине вычисляется так (я обажаю GLSL синтаксис):
//Функция принимает в качестве аргументов координаты четырёх вершин и возвращает вектор нормали к центральной вершине vec3 GetNormal(const vec3& Top, const vec3& Left, const vec3& Right, const vec3& Bottom) { vec3 rightVec = Right-Left; //Вычислим вектор, направленный вправо vec3 topVec = Top-Bbottom; //Вычислим вектор, направленный вверх vec3 perpendicular = cross( rightVec, topVec ); //Вычислим перпендикуляр к этим двум векторам return normalize( perpendicular ); //Напоследок нормализуем возвращаемый вектор }
[Беженец со Скаев]
Сообщение отредактировал Yandersen - Вс, 06 Май 2012, 18:46 |
|
| |