![]() |
Модераторы: Rickert, Alexeis, BorisVorontsov |
![]() ![]() ![]() |
|
Trojian |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 30.5.2007 Где: Voronezh Репутация: нет Всего: нет |
Доброго времени суток.
Начал изучать С++ и DirectX9. Научился выводить стандартные Mesh-ы, а ландшафт на основе карты высот создать не получается. Если вам не сложно, объясните, пожалуйста, "на пальцах" как создавать и отрисовывать такой ландшафт так как я новичок и пока всё сложно даётся, если можно то примеры. Заранее спасибо за помощь. |
|||
|
||||
kurlyak |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 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". что касаеться ланшафта в виде меша - то этот код я разрабатывал сам. где почитать не знаю. |
|||
|
||||
lokod |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 2.2.2012 Где: Красноуральск Репутация: -1 Всего: -1 |
Модератор: Сообщение скрыто. |
|||
|
||||
lokod |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 2.2.2012 Где: Красноуральск Репутация: -1 Всего: -1 |
Модератор: Сообщение скрыто. |
|||
|
||||
![]() ![]() ![]() |
Вы можете найти полезным что... | |
|
|
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Мультимедия, OpenGL/DirectX | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |