Вот выдрал кусок из кода своего движка:
'\\ Процедура создания ландшафта:
Public Sub GenerateHugeTerrain(HieghtMap As String, Precision As CONST_R3DLANDQUALITY)
'\\ Задесь: HeightMap - карта высот, т.е. рисунок BMP, думаю объяснять не надо...
'\\ Precision - точность ландшафта. Для загрузки больших ландшафтов (ну к примеру 1024х1024 пикселей) лучше это число сделать побольше...
'\\ Загружаем рисунок в пикчурбокс. Пикчурбокс должен быть:
'\\ а) autosize = true
'\\ б) borderstyle = 0 - none
'\\ и если уж два предыдущих пункта несовсем обязательные, то в) scalemode = 3 - pixel, должно быть обязательно
frmUtil.picUtil1.Picture = LoadPicture(HieghtMap)
'\\ загрузили! теперь назначаем некоторые переменные:
Dim X As Integer, Y As Integer '\\ для двух циклов
Dim h(3) As Single, Blank As Long '\\ h(3) - высоты, о них позже, blank - цветовая составляющая типа D3DLVERTEX2
'\\ Кусок выдран нагло из класса ландшафта моего движка, поэтому тут есть переменные, объявленные в general\declarations класса
'\\ Вот например точность ландшафта:
LandPrecision = Precision
'\\ Ну белый цвет...
Blank = RGB(255, 255, 255)
'\\ Запоминаем ширину и высоту карты высот, пригодится...
pWidth = frmUtil.picUtil1.ScaleWidth
pHeight = frmUtil.picUtil1.ScaleHeight
'\\ Циклы, самое главное!
For X = 1 To pWidth Step Precision
For Y = 1 To pHeight Step Precision
'\\ вытаскиваем четыре высоты из карты высот: (типа квадратик из четырех вершин):
h(0) = GetPixel(frmUtil.picUtil1.hdc, X, Y) / 100000
h(1) = GetPixel(frmUtil.picUtil1.hdc, X + 1 * Precision, Y) / 100000
h(2) = GetPixel(frmUtil.picUtil1.hdc, X + 1 * Precision, Y + 1 * Precision) / 100000
h(3) = GetPixel(frmUtil.picUtil1.hdc, X, Y + 1 * Precision) / 100000
'\\ Вершины-то четыре, но каждый четырехугольник состоит из двух треугольников, значит +6 точек в массив
VertexCount = VertexCount + 6
'\\ Увеличиваем массив, не стирая данные
ReDim Preserve LandVertex(VertexCount)
'\\ создаем те самые новые 6 вертексов:
LandVertex(VertexCount - 6) = CreateLVertex2(CSng(X), h(0), CSng(Y), Blank, Blank, 2, 2, 0, 0)
LandVertex(VertexCount - 4) = CreateLVertex2(X + Precision, h(1), CSng(Y), Blank, Blank, 2, 0, 0, 0)
LandVertex(VertexCount - 5) = CreateLVertex2(X + Precision, h(2), Y + Precision, Blank, Blank, 0, 0, 0, 0)
LandVertex(VertexCount - 3) = CreateLVertex2(X + Precision, h(2), Y + Precision, Blank, Blank, 0, 0, 0, 0)
LandVertex(VertexCount - 1) = CreateLVertex2(CSng(X), h(3), Y + Precision, Blank, Blank, 0, 2, 0, 0)
LandVertex(VertexCount - 2) = CreateLVertex2(CSng(X), h(0), CSng(Y), Blank, Blank, 2, 2, 0, 0)
Next Y
Next X
End Sub
Вот и все, а ты боялся! Если заработает, то с тебя пиво!
Кстати, я тебе скинул довольно таки старую версию ландшафта. Запустив проект, ты увидишь при рендеринге лишь убогие горки, которые не реагируют на направленный источник света. Для избежания таких глюков следует рассчитать нормали для этого ландшафта. Как это делается - расскажу после того как у тебя все заработает и ты купишь мне пиво (шучу
) Потом еще на ландшафт надо натянуть карту цветов или как там она называется. Это нужно для того, чтобы твой ландшафт не был покрыт в любой точке одной и той же текстурой. То есть так и будет, но вид будет другой. В общем круто будет
Далее то, с чем ты наверняка будешь мучаться. Ты сделал ландшафт и чво дальше? Хочеться ведь по нему побегать, пожевать трав... Тфу! В общем травка тут ни при чем, а вот узнать высоту точки на ландшафте - дело нужное и предельно простое, но я все равно до этого доходил неделю. Так что твори, сообщай об успехах, если че - поможу. Копи деньги на пиво.