Вот например, все обьекты (планеты, солнце, фон) это один меш. Intersect находит первый нарисованый(это фон), но остальные. Подскажи как можно, это сделать (желательно код)
вот код как происходит рендер
- Код: Выделить всё
Option Explicit
Public KolSustemPlanet As Integer, SkyID_Tex As Integer, SkyID_Mesh As Integer
Public Enum eTypObj
sSun = 0
sPlanet = 1
sAster = 2
sShip = 3
sStation = 4
End Enum
Private Sustem_Mesh() As Sustem_Obj
Private Type Sustem_Obj
PosX As Single
PosY As Single
PosZ As Single
РадиусТела As Single
РадиусОрбиты As Single
Сутки As Single
ОрбитаСкорость As Single
Faza As Single
ID_Mesh As Integer
ID_Tex As Integer
Type_Obj As eTypObj
Class_Obj As Integer
Obj_Name As String
End Type
Private t As Double
'=================================================================
'== ==
'== Render Sustem ==
'== ==
'=================================================================
Public Sub Sustem_Draw()
Dim SekX As Double, SekY As Double
Dim i As Integer, Steps As Single
Dim vI As D3DVECTOR
Dim d As Single
Dim h As Long
Dim it As Single
SkyID_Tex = Find_Texturs("Sky1.dds")
D3DDevice.SetRenderState D3DRS_ZENABLE, 1
D3DDevice.SetRenderState D3DRS_CULLMODE, D3DCULL_CCW
D3DDevice.SetRenderState D3DRS_LIGHTING, 1
DrawSusMesh Mesh_Model(SkyID_Mesh), 0, 0, 0, SkyID_Tex, Sustem_Mesh(0).РадиусТела * 100000, Sustem_Mesh(0).РадиусТела * 100000, Sustem_Mesh(0).РадиусТела * 100000
DrawSusMesh Mesh_Model(Sustem_Mesh(0).ID_Mesh), 0, 0, 0, Sustem_Mesh(0).ID_Tex, Sustem_Mesh(0).РадиусТела, Sustem_Mesh(0).РадиусТела, Sustem_Mesh(0).РадиусТела
For i = 1 To 8
If Rend_Setka = True Then
Lines sКруг, 0.5, vec3(0, 0, 0), vec3(0, 0, 0), &HFFFFFF, Nothing, Sustem_Mesh(i).РадиусОрбиты
End If
Sustem_Mesh(i).PosX = -Sustem_Mesh(i).РадиусОрбиты * Sin(Sustem_Mesh(i).ОрбитаСкорость * t + Sustem_Mesh(i).Faza): Sustem_Mesh(i).PosZ = Sustem_Mesh(i).РадиусОрбиты * Cos(Sustem_Mesh(i).ОрбитаСкорость * t + Sustem_Mesh(i).Faza)
Sustem_Mesh(i).PosY = 0
'If Обьект(ind).RotX > g_pi Then Обьект(ind).RotX = -g_pi
'If Обьект(ind).RotY > g_pi Then Обьект(ind).RotY = -g_pi
'If Обьект(ind).RotZ > g_pi Then Обьект(ind).RotZ = -g_pi
DrawSusMesh Mesh_Model(Sustem_Mesh(i).ID_Mesh), Sustem_Mesh(i).PosX, Sustem_Mesh(i).PosY, Sustem_Mesh(i).PosZ, Sustem_Mesh(i).ID_Tex, Sustem_Mesh(i).РадиусТела, Sustem_Mesh(i).РадиусТела, Sustem_Mesh(i).РадиусТела
D3DXVec3Scale vI, CamPos, -1
D3DXVec3Normalize vI, vI 'Инвертированная нормализованная позиция камеры (направление луча)
D3DX.Intersect Mesh_Model(SkyID_Mesh).Model, CamPos, vI, h, 0, 0, 0, d, 0
If h Then
DrawText sArial, "Mesh - " & i & " Distance" & d, 1, 105, D3DColorARGB(255, 255, 0, 0)
'D3DXVec3Scale vI, vI, d
'D3DXVec3Add v, v, vI
'D3DXMatrixTranslation Mtrx, v.X, v.y, v.z
'D3DDevice.SetTransform D3DTS_WORLD, Mtrx
'Sphere.DrawSubset 0
End If
Next
t = t + 0.0005
D3DXMatrixIdentity matWorld
D3DDevice.SetTransform D3DTS_WORLD, matWorld
End Sub
Private Sub Class_Initialize()
Dim i As Integer
KolSustemPlanet = 10
ReDim SustemIDTex(KolSustemPlanet)
ReDim Sustem_Mesh(KolSustemPlanet)
SkyID_Mesh = Find_Mesh_Name("Sky.X")
SkyID_Tex = Find_Texturs("Sky9.jpg")
i = 0: Sustem_Mesh(i).РадиусТела = 320: Sustem_Mesh(i).РадиусОрбиты = 0: Sustem_Mesh(i).Сутки = -29: Sustem_Mesh(i).ОрбитаСкорость = 0: Sustem_Mesh(i).Faza = 0
i = 1: Sustem_Mesh(i).РадиусТела = 5: Sustem_Mesh(i).РадиусОрбиты = 17000000: Sustem_Mesh(i).Сутки = -1 / 234: Sustem_Mesh(i).ОрбитаСкорость = 2 * g_pi / 87.66: Sustem_Mesh(i).Faza = 2 * g_pi * 345 / 360:
i = 2: Sustem_Mesh(i).РадиусТела = 50: Sustem_Mesh(i).РадиусОрбиты = 25000000: Sustem_Mesh(i).Сутки = 0.5: Sustem_Mesh(i).ОрбитаСкорость = 2 * g_pi / 226.46: Sustem_Mesh(i).Faza = 2 * g_pi * 55 / 360
i = 3: Sustem_Mesh(i).РадиусТела = 50: Sustem_Mesh(i).РадиусОрбиты = 40000000: Sustem_Mesh(i).Сутки = -1: Sustem_Mesh(i).ОрбитаСкорость = 2 * g_pi / 365.26: Sustem_Mesh(i).Faza = 2 * g_pi * 10 / 360
i = 4: Sustem_Mesh(i).РадиусТела = 45: Sustem_Mesh(i).РадиусОрбиты = 55000000: Sustem_Mesh(i).Сутки = -0.9: Sustem_Mesh(i).ОрбитаСкорость = 2 * g_pi / 686.68: Sustem_Mesh(i).Faza = 2 * g_pi * 277.5 / 360
i = 5: Sustem_Mesh(i).РадиусТела = 100: Sustem_Mesh(i).РадиусОрбиты = 70000000: Sustem_Mesh(i).Сутки = -0.5: Sustem_Mesh(i).ОрбитаСкорость = 2 * g_pi / 4331.98: Sustem_Mesh(i).Faza = 2 * g_pi * 290 / 360
i = 6: Sustem_Mesh(i).РадиусТела = 90: Sustem_Mesh(i).РадиусОрбиты = 94000000: Sustem_Mesh(i).Сутки = -0.3: Sustem_Mesh(i).ОрбитаСкорость = 2 * g_pi / 10760.56: Sustem_Mesh(i).Faza = 2 * g_pi * 60 / 360
i = 7: Sustem_Mesh(i).РадиусТела = 60: Sustem_Mesh(i).РадиусОрбиты = 114000000: Sustem_Mesh(i).Сутки = -0.3: Sustem_Mesh(i).ОрбитаСкорость = 2 * g_pi / 30685.49: Sustem_Mesh(i).Faza = 2 * g_pi * 15 / 360
i = 8: Sustem_Mesh(i).РадиусТела = 60: Sustem_Mesh(i).РадиусОрбиты = 128000000: Sustem_Mesh(i).Сутки = -0.5: Sustem_Mesh(i).ОрбитаСкорость = 2 * g_pi / 60191.19: Sustem_Mesh(i).Faza = 2 * g_pi * 22 / 360
i = 9: Sustem_Mesh(i).РадиусТела = 20: Sustem_Mesh(i).РадиусОрбиты = 7500000: Sustem_Mesh(i).Сутки = -27.32: Sustem_Mesh(i).ОрбитаСкорость = 2 * g_pi / 27.32: Sustem_Mesh(i).Faza = 2 * g_pi * 82.41 / 360
i = 10: Sustem_Mesh(i).РадиусТела = 13: Sustem_Mesh(i).РадиусОрбиты = Sustem_Mesh(6).РадиусОрбиты: Sustem_Mesh(i).Сутки = 1: Sustem_Mesh(i).ОрбитаСкорость = Sustem_Mesh(6).ОрбитаСкорость: Sustem_Mesh(i).Faza = Sustem_Mesh(6).Faza
t = -13490.4
InitSustemMesh
End Sub
Public Function InitSustemMesh()
Dim i As Integer, ind As Integer
On Local Error Resume Next
ind = Find_Texturs("EarthMap.dds")
Sustem_Mesh(0).ID_Tex = Find_Texturs("Sun 1.dds")
Sustem_Mesh(0).Type_Obj = sSun
Sustem_Mesh(0).Class_Obj = 2
Sustem_Mesh(0).Obj_Name = "Sun"
For i = 1 To KolSustemPlanet - 1
Sustem_Mesh(i).ID_Mesh = Find_Mesh_Name("Сфера.X")
Sustem_Mesh(i).ID_Tex = ind
Sustem_Mesh(i).Type_Obj = sPlanet
Sustem_Mesh(i).Class_Obj = 1
Sustem_Mesh(i).Obj_Name = "Planet"
Next i
End Function
'Эта процедура рисует 3d объект в определённой точке пространства
Private Sub DrawSusMesh(ByRef mDrawing As GameMesh, mXx As Single, mYy As Single, mZz As Single, ind As Integer, Optional ScalX! = -1, Optional ScalY! = -1, Optional ScalZ! = -1, Optional RotX! = 0, Optional RotY! = 0, Optional RotZ! = 0)
Dim matWorld As D3DMATRIX
Dim matRot As D3DMATRIX
Dim matScal As D3DMATRIX
Dim matRotX As D3DMATRIX
Dim matRotY As D3DMATRIX
Dim matRotZ As D3DMATRIX
D3DXMatrixScaling matScal, ScalX, ScalY, ScalZ
D3DXMatrixRotationX matRotX, RotX
D3DXMatrixRotationY matRotY, RotY
D3DXMatrixRotationZ matRotZ, RotZ
D3DXMatrixMultiply matRot, matRotX, matRotY
D3DXMatrixMultiply matRot, matRot, matRotZ
If ScalX <> -1 Then D3DXMatrixMultiply matRot, matScal, matRot
D3DXMatrixTranslation matWorld, mXx, mYy, mZz
D3DXMatrixMultiply matWorld, matRot, matWorld
D3DDevice.SetTransform D3DTS_WORLD, matWorld
Texture_StageStatesDisab
D3DDevice.SetTextureStageState 0, D3DTSS_MIPFILTER, D3DTEXF_LINEAR
D3DDevice.SetTextureStageState 0, D3DTSS_MINFILTER, D3DTEXF_LINEAR
D3DDevice.SetTextureStageState 0, D3DTSS_MAGFILTER, D3DTEXF_LINEAR
D3DDevice.SetRenderState D3DRS_ALPHABLENDENABLE, False
D3DDevice.SetTexture 0, Текстура(ind).Textures
D3DDevice.SetTexture 1, Nothing
D3DDevice.SetTexture 2, Nothing
D3DDevice.SetMaterial mDrawing.MeshMaterials(0)
mDrawing.Model.DrawSubset 0
D3DXMatrixIdentity matWorld
D3DDevice.SetTransform D3DTS_WORLD, matWorld
End Sub
текстуры, мешы, грузятся в одном экземпляре. каждому присваивается ID по имени нахожу нужный ID. Поиск и Загрузка автоматическая.