Yurich » 10.07.2003 (Чт) 0:43
Привет, Мират!
Технология создания Direct3D7 (в смысле оконч продукта) довольно длительна и муторна. Подробностями технологии киты игрового бизнеса ни с кем делиться не будут. Так что, будет тяжело. Могу посоветовать начать с RM-mode (в нем проще освоить азы). Отличается от IM незначительно. Я не крутой в D3D, но за пол-года научился делать модели, правильно накладывать текстуры, управлять моделями, сглаживание, туман, освещение, прозрачность, перемещение камеры (как в нормальной 3D от клавы и мыши), DirecMusic & Sound. Впереди полупрозрачность и анимация.
Что надо:
1. 3DSMax или подобный
2. DX7SDK
3. Конвертер .3DS в .X (идет вместе с SDK)
4. Как можно больше работоспособных примеров.
Чтобы не было скучно, читай ниже!!!
В модуль:
Option Explicit
' Патчи для поиска файлов
' -----------------------------------------------------------------------
Public MeshPath As String ' Путь для загрузки Х-моделей
Public BmpPath As String ' Путь для загрузки текстур
' Объекты DirectX 7
' -----------------------------------------------------------------------
Public dx As New DirectX7 ' От него все произрастает
Public DDFullScreen As DirectDraw4 ' Объект DirectDraw для
' полноэкранного режима
Public D3DRM As Direct3DRM3 ' Объект D3D:RM
Public ddsd3D As DDSURFACEDESC2 ' Описание поверхности
Public Caps As DDSCAPS2 ' Описание аппаратных
' возможностей
Public Device As Direct3DRMDevice3 ' Устройство рендеринга
Public Scene As Direct3DRMFrame3 ' Фрейм сцены
Public CameraSupport As Direct3DRMFrame3 ' Фрейм тележки для
' камеры
Public Camera As Direct3DRMFrame3 ' Фрейм камеры
Public CameraLight As Direct3DRMLight ' Подсветка со стороны
' камеры
Public MainLightPoint As Direct3DRMLight ' Основное точечное
' освещение сцены
Public MainLightAmbient As Direct3DRMLight ' Основное окружающее
' освещение сцены
Public FrameMainLight As Direct3DRMFrame3 ' Фрейм основного
' освещения сцены
Public dds4Primary As DirectDrawSurface4 ' Передний буфер для
' DDFullScreen
Public dds4Back As DirectDrawSurface4 ' Задний буфер для
' DDFullScreen
Public ViewPort As Direct3DRMViewport2 ' Все будет
' рендериться сюда
Public RenderGuid As String ' Используемое
' устройство
' рендеринга
Public Texture As Direct3DRMTexture3 'Текстура
Public Face As Direct3DRMFace2 ' Лицо модели
Public Const BACKSURFACECOLORNULL = 0 ' Цвет для заднего
' буфера
Public RC As RECT
Public Sub InitFullscreen(HWnd As Long, sX As Long, sY As Long, sBitDepth As Long)
' Стандартное создание DirectDraw4 с главной поверхностью и
' одним задним буфером
' (под 3D ускоритель)
RenderGuid = "IID_IDirect3DHALDevice"
ddsd3D.lFlags = DDSD_BACKBUFFERCOUNT Or DDSD_CAPS
ddsd3D.ddsCaps.lCaps = DDSCAPS_PRIMARYSURFACE Or DDSCAPS_3DDEVICE Or DDSCAPS_COMPLEX Or DDSCAPS_FLIP
ddsd3D.lBackBufferCount = 1
Set DDFullScreen = dx.DirectDraw4Create("")
DDFullScreen.SetCooperativeLevel HWnd, DDSCL_FULLSCREEN Or DDSCL_EXCLUSIVE Or DDSCL_ALLOWREBOOT
DDFullScreen.SetDisplayMode sX, sY, sBitDepth, 0, DDSDM_STANDARDVGAMODE
Set dds4Primary = DDFullScreen.CreateSurface(ddsd3D)
Caps.lCaps = DDSCAPS_BACKBUFFER _
Or DDSCAPS_3DDEVICE Or DDSCAPS_VIDEOMEMORY
Set dds4Back = dds4Primary.GetAttachedSurface(Caps)
' Создание Direct3D:RM
' --------------------------------------------------
Set D3DRM = dx.Direct3DRMCreate()
Set Device = D3DRM.CreateDeviceFromSurface(RenderGuid, DDFullScreen, dds4Back, D3DRMDEVICE_DEFAULT)
Device.SetRenderMode D3DRMRENDERMODE_VIEWDEPENDENTSPECULAR _
Or D3DRMRENDERMODE_BLENDEDTRANSPARENCY
'Or D3DRMRENDERMODE_SORTEDTRANSPARENCY
Device.SetQuality D3DRMRENDER_GOURAUD ' Or D3DRMSHADE_GOURAUD
'Device.SetShades 256
Device.SetDither D_TRUE
Device.SetTextureQuality D3DRMTEXTURE_MIPLINEAR
Set Scene = D3DRM.CreateFrame(Nothing)
' Создадим "тележку", на которой будет стоять камера.
Set CameraSupport = D3DRM.CreateFrame(Scene)
' Прицепим на тележку камеру.
Set Camera = D3DRM.CreateFrame(CameraSupport)
' Чертов ViewPort - долго из-за него пришлось повозиться
Set ViewPort = D3DRM.CreateViewport(Device, Camera, 0, 0, sX, sY)
End Sub
Public Sub DestroyEverything()
'Убиваем все что можно и нельзя
Set dds4Back = Nothing
Call DDFullScreen.RestoreDisplayMode
Call DDFullScreen.SetCooperativeLevel(0, DDSCL_NORMAL)
Set DDFullScreen = Nothing
Set ViewPort = Nothing
Set Device = Nothing
Set D3DRM = Nothing
Set dx = Nothing
End Sub
Public Sub GetBackSurfaceDescription(ddsBack As DirectDrawSurface4)
'Получить описание очищаемой поверхности
ddsBack.GetSurfaceDesc ddsd3D
'Заполняем структуру RECT, так, чтобы она охватывала всю поверхность
With RC
.Top = 0
.Left = 0
.Right = ddsd3D.lWidth ' Вот зачем нам надо было описание поверхности
.Bottom = ddsd3D.lHeight ' Высота и ширина подгоняются под нее
End With
End Sub
Public Sub ClearBuffer3D(dds As DirectDrawSurface4)
' Заполняем цветом область, указанную в RC (задний буфер)
dds.BltColorFill RC, BACKSURFACECOLORNULL
End Sub
Public Sub DestroyAll()
'SoundStop BackSound
'DestroyDS ' Уничтожить DirectSound
'DestroyKeyboard
'DestroyMouse
DestroyEverything ' Уничтожить все созданные D3D объекты
End Sub
' В форму:
' --------------------------------------------------------------------
Option Explicit
Implements DirectXEvent
Dim Running As Boolean 'Программа все еще работает?
Dim dir As D3DVECTOR
Dim up As D3DVECTOR
Dim CX As Single, CZ As Single
Dim CameraX As Single
Dim CameraY As Single
Dim CameraZ As Single
' Головной SUB
Private Sub Form_Load()
Dim MyFont As New StdFont
Dim Fps As Integer
Dim i As Integer, D As Integer
' -------------------- настройка патчей
SoundPath = App.Path & "\Sound\"
MeshPath = App.Path & "\Meshes\"
BmpPath = App.Path & "\Bitmaps\"
Dim Flags As Long
' Установить окно проги поверх всех остальных (надо подключить
' к проекту Win32.tlb или описать эту API ф-ю ручками)
SetWindowPos Me.HWnd, -1, 0, 0, Me.Width / Screen.TwipsPerPixelX, Me.Height / Screen.TwipsPerPixelY, Flags
' ---------------------------------------------------------------------------------------------------------------------------------
' Инициализация Direct3D
InitFullscreen Me.HWnd, 800, 600, 16
' ----------------------------------------------------------------------------------------------------------------------------------
' подготвка сцены и запуск
LoadMyObjects
dds4Back.SetFontBackColor dx.CreateColorRGB(100, 20, 180)
dds4Back.SetFontTransparency False
MyFont.Size = 22
MyFont.Name = "Arial"
dds4Back.SetFont MyFont
Running = True
' Опции отображения
'ViewPort.SetField 0.5
ViewPort.SetBack 5000 ' Задает радиус видимости объектов
'ViewPort.SetPlane -1, 1, -1, 1 ' Придает изображению трапецеидальность
'ViewPort.SetUniformScaling D_FALSE ' Что-то похожее на предыдущее, но в
' вертикальном направлении. Картинка
' как бы сплющивается (трапецеидальность
' проявляется при наклоне камеры).
Dim FPSTimer As Single
Do While Running
DoEvents ' Обязательная строка !!!
i = i + 1
If Timer - FPSTimer > 1 Then
Fps = i
FPSTimer = Timer
i = 0
End If
dds4Back.BltColorFill RC, BACKSURFACECOLORNULL 'Чистим задний буфер
D3DRM.Tick 0 ' Рендеринг кадра
dds4Back.DrawText 100, 100, "FPS=" & Fps, True
dds4Primary.Flip Nothing, DDFLIP_NOVSYNC Or DDFLIP_WAIT 'Показываем сцену
Loop
DestroyAll ' Выход
Unload Me
End Sub
Sub LoadMyObjects()
' Без этой строки текстуры грузятся только из корневой
' папки проекта
D3DRM.SetSearchPath BmpPath
' Елки-палки
Dim Tree As Direct3DRMMeshBuilder3
Set Tree = D3DRM.CreateMeshBuilder
Tree.LoadFromFile MeshPath & "Tree.x", 0, D3DRMLOAD_FROMFILE, Nothing, Nothing
Tree.SetColorRGB 1, 1, 1
Set Face = Tree.GetFace(0)
Set Texture = Face.GetTexture
Texture.SetDecalTransparency D_TRUE ' прозрачность
Texture.SetDecalTransparentColor 0 ' черный прозрачен
Tree.SetQuality D3DRMRENDER_GOURAUD Or D3DRMLIGHT_ON
Scene.AddVisual Tree
' Объект для установки основного освещения
Set FrameMainLight = D3DRM.CreateFrame(Scene)
' Основное точечное освещение сцены
'Set MainLightPoint = D3DRM.CreateLight(D3DRMLIGHT_POINT, dx.CreateColorRGB(1, 1, 1))
' Основное окружающее освещение сцены
Set MainLightAmbient = D3DRM.CreateLightRGB(D3DRMLIGHT_AMBIENT, 0.75, 0.75, 0.75)
' Точечное освещение со стороны камеры
'Set CameraLight = D3DRM.CreateLight(D3DRMLIGHT_POINT, dx.CreateColorRGB(0.6, 0.6, 0.6))
'Camera.AddLight CameraLight
'FrameMainLight.AddLight MainLightPoint
FrameMainLight.AddLight MainLightAmbient
'FrameMainLight.SetPosition Nothing, 0, 20, 0
' ---------------------
'Устанавливаем камеру
CameraX = 0
CameraY = 0
CameraZ = -100
CameraSupport.SetPosition Nothing, CameraX, Floor(CurrentFloor).MaxY, CameraZ
Camera.SetPosition CameraSupport, 0, 0, 0
End Sub
' По обработке клавы для выхода смотри в DX-форуме!!!
' Спрашивай, безусловно постараюсь помочь.