Модераторы: Rickert, Alexeis, BorisVorontsov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ландшафт 
:(
    Опции темы
Trojian
Дата 29.6.2010, 01:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 30.5.2007
Где: Voronezh

Репутация: нет
Всего: нет



Доброго времени суток. 

  Начал изучать С++ и DirectX9. Научился выводить стандартные Mesh-ы, а ландшафт на основе карты высот создать не получается. 
  Если вам не сложно, объясните, пожалуйста, "на пальцах"  как создавать и отрисовывать такой  ландшафт так как я новичок и пока всё сложно даётся, если можно то примеры.

Заранее спасибо за помощь.
PM MAIL ICQ   Вверх
kurlyak
Дата 30.6.2010, 01:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 218
Регистрация: 7.11.2007

Репутация: 1
Всего: 3



Для начала вот тебе мои исходники http://rapidshare.com/files/403917541/Terrain.rar.html. Прикольный у тебя ник на форуме - но думаю ты не hacker хотя и trojan - если что мне ничего взламывать не надо. я законопослушный гражданин и вобще god bless America!!!

Теперь по делу.
Что такое карта высот? это обыкновенный файл созданный в фотошоп. черно - белый файл. открываешь фотошоп. создаешь новый документ с режимом "серый". после того как ты создал такой файл или вобще какой то новый документ в фотошопе - ты можешь поменять режим в меню "изображение->режим" поставить обязательно 8 бит. размер нового документа берешь 64 на 64 пикселя. вобще любой берешь размер, только надо его запомнить. берешь в фотошопе кисть и рисуешь ландшафт по своему документу. где черный цвет - значит высота ноль. где белый значит высота 255. то есть 8 бит оттенков серого цвета на каждый пиксель. понятно? 8 бит это 255 комбинаций где 0 черный, 255 совершенно белый. все остальные комбинации от 0 до 255 оттенки серого. нарисовал ты такой документ в фотошопе. дальше сохрани его как файл *.raw расширение. что такое raw файл я уже объяснил выше и кроме того добавлю что такой файл (сырой в переводе raw) храниться на диске без заголовка а не как jpg или bmp вроде которые заголовок имеют в начале файла. то есть с начала файла raw идут сырые данные - биты цвета оттенка серого. 

Дальше загружаешь в своей программе С++ DirectX этот файл в массив. например у тебя raw файл твой получился размером в фотошопе 64 пикселя на 64 пикселя. вот - грузишь в программе raw файл в массив 64 на 64. дальше в программе создаешь сетку из треугольников 64 треугольника на 64 причем в этой сетке назначаешь 1 пиксель raw файла равен 10 пикселям сетки. то есть 64 квадратика на 64 квадратика ландшафта (квадратик в DirectX это два смежных треугольника) по 10 пикселей в длинну и ширину каждый. а вершинам этих квадратиков назначаешь (то есть высоту ландшафта Y в каждой точке) значение из raw файла. например 1- й пиксель в raw файле имеет ровно серый цвет 128 значение. значит высота первой вершины первого квадратика (грубо говоря) равно 128 пикселям (можешь масштабировать делить высоту на любой масштаб например 128 поделить на 10 равно приблизительно 13 - значит высота 13 пикселей). вот. берешь следующее значение из raw файла. предположим оно равно 64. значит высота вершины второго квадрата ландшафта, следующего через 10 пикселей как мы и приняли выше - 64 пикселя (масштаб 64 поделить на 10 равно приблизительно 6 пикселей высота). и так дальше. смотри код который я предложил скачать. вот тебе элементраные знания по построению ландшафта на основе карты высот из raw файла.

второй подход к построению ландшафта это использование мешей которые рисуються в пакете 3ds max или тому подобных. нарисовал мешь ландшафта. вывел мешь в окно программы directx. дальше используешь функцию D3DXIntersect() в параметрах которой указываешь что искать пересечение по вектору оси Y ( то есть по высоте. см. мой второй пример) и задаешь этот вектор в функции D3DXIntersect():

D3DXVECTOR3 vDirTemp;
vDirTemp.x=0;
vDirTemp.y=-1;
vDirTemp.z=0;

эта функция D3DXIntersect() возвращает расстояние до меша по заданному вектору (у нас высота Y заданная в векторе vDirTemp) и номер Face то есть полигона с которым произошло пересечение. дальше берешь координаты этого теугольника полигона( у нас есть его номер) - а это 3 координаты и вычисляешь барицентрическую интерполяцию (это интерполяция между 3-мя векторами). в конец устанавливаешь высоту камеры исходя из значения которое вернула функция барицентрической интерполяции:

D3DXVec3BaryCentric(&pY,&vec1,&vec2,&vec3,fBary1,fBary2);
m_Camera.SetYAcxis(pY.y+5);

Более подробно о карте высот в книге Франка Луны "ВВЕДЕНИЕ В ПРОГРАММИРОВАНИЕ ТРЕХМЕРНЫХ ИГР С DirectX 9.0". что касаеться ланшафта в виде меша - то этот код я разрабатывал сам. где почитать не знаю.
        

PM MAIL   Вверх
lokod
Дата 2.2.2012, 16:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 2.2.2012
Где: Красноуральск

Репутация: -1
Всего: -1




Модератор: Сообщение скрыто.

PM MAIL   Вверх
lokod
Дата 4.2.2012, 14:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 2.2.2012
Где: Красноуральск

Репутация: -1
Всего: -1




Модератор: Сообщение скрыто.

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Вы можете найти полезным что...
Alexeis
Rickert
  • Английская документация по DirectX лежит где-то здесь.
  • Английская документация по OpenGL лежит где-то там.
  • Гейм-дев у нас обсуждают где-то тут

Ждём вас! С уважением, Alexeis, Rickert.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Мультимедия, OpenGL/DirectX | Следующая тема »


 




[ Время генерации скрипта: 0.0635 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.