forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   3D-программирование (http://forum.boolean.name/forumdisplay.php?f=12)
-   -   Меш, созданный вручную, проблема с освещением (http://forum.boolean.name/showthread.php?t=12271)

voron 26.03.2010 07:13

Меш, созданный вручную, проблема с освещением
 
Создал меш с помощью Addvertex и AddTriangle. Меш пока представляет из себя плоскость n*m, потом будет рельеф.

Создвл источник света

Код:

PositionEntity pivot_light,num_square_x*num_polig/2,0,num_square_y*num_polig/2
light=CreateLight(1,pivot_light)
PositionEntity light,0,20,0
LightRange light,400

Меш остаётся тёмным.

Попробовал UpdateNormals - не помогло

Попробовал вручную расставить нормали, тоже не помогло
Код:

  nx#=VertexX(relief_surf,vertex)
  ny#=VertexY(relief_surf,vertex)+100
  nz#=VertexZ(relief_surf,vertex)
 
  VertexNormal relief_surf,vertex,nx#,ny#,nz#

AmblientLight использовать считаю нецелесообразным, т.к. буду двигать источник света, имитируя освещение днём, вечером, ночью.

Как правильно расставить нормали?

H@NON 26.03.2010 09:54

Ответ: Меш, созданный вручную, проблема с освещением
 
пользуйся
Код:

;plane MxN 
 ;author: avel

 Graphics3D 800,600,32,2
  SetBuffer BackBuffer()

 camera=CreateCamera()
  PositionEntity camera,0,10,0
 TurnEntity camera,90,0,0

 Dim  vertex(0,0)

 m=CreatePlaneMN(2,3,2,1)

 WireFrame 1

 Repeat

 If KeyHit(1) Then Exit

 UpdateWorld()
  RenderWorld()
 Flip
   
 Forever
 End

 Function  CreatePlaneMN(m=1,n=1,dm=1,dn=1)
 Local i, j
 Local  mesh=CreateMesh()
 Local surf=CreateSurface(mesh)
 Dim  vertex(m+1,n+1)
 For i=0 To m
  For j=0 To n
    vertex(i,  j) = AddVertex(surf, i*dm, 0, j*dn)
  Next
 Next 
 For i=0  To m-1
  For j=0 To n-1
    AddTriangle(surf,vertex(i,  j),vertex(i, j+1),vertex(i+1, j))
    AddTriangle(surf,vertex(i,  j+1),vertex(i+1, j+1),vertex(i+1, j))
  Next
 Next 
  UpdateNormals mesh
 Return mesh
 End Function


voron 26.03.2010 22:11

Re: Меш, созданный вручную, проблема с освещением
 
Код:

Graphics3D 800,600,32,2
  SetBuffer BackBuffer()

 camera=CreateCamera()
  PositionEntity camera,0,10,0
 TurnEntity camera,90,0,0

 Dim  vertex(0,0)

 m=CreatePlaneMN(2,3,2,1)

; WireFrame 1

light=CreateLight()
PositionEntity light,0,5,0


 Repeat


 If KeyHit(1) Then Exit

 UpdateWorld()
  RenderWorld()
 Flip
   
 Forever
 End

 Function  CreatePlaneMN(m=1,n=1,dm=1,dn=1)
 
 Local i, j
 Local  mesh=CreateMesh()
 Local surf=CreateSurface(mesh)
 Dim  vertex(m+1,n+1)
 For i=0 To m
  For j=0 To n
    vertex(i,  j) = AddVertex(surf, i*dm, 0, j*dn)
  Next
 Next 
 For i=0  To m-1
  For j=0 To n-1
    AddTriangle(surf,vertex(i,  j),vertex(i, j+1),vertex(i+1, j))
    AddTriangle(surf,vertex(i,  j+1),vertex(i+1, j+1),vertex(i+1, j))
  Next
 Next 
  UpdateNormals mesh
 Return mesh
 End Function

У меня меш остался серым

voron 29.03.2010 01:52

Re: Меш, созданный вручную, проблема с освещением
 
Копался в коде и нашёл вот что. Пример кода.

Код:

Graphics3D 1024,768,16,2
SetBuffer BackBuffer()

light_2=CreateLight()
;cube3=CreateCube(light_2)
PositionEntity light_2,0,20,0

cube=CreateCube()
PositionEntity cube,0,20,-10
cube=CreateCube()
PositionEntity cube,0,20,10
cube=CreateCube()
PositionEntity cube,-10,20,0
cube=CreateCube()
PositionEntity cube,10,20,0

pivot=CreatePivot()                     
camera=CreateCamera(pivot) 

Repeat


If (Not KeyDown(29)) And (KeyDown(205)) MoveEntity pivot ,1,0,0
If (Not KeyDown(29)) And (KeyDown(203)) MoveEntity pivot ,-1,0,0
If (Not KeyDown(29)) And (Not KeyDown (56)) And (KeyDown(200)) MoveEntity pivot ,0,0,1
If (Not KeyDown(29)) And (Not KeyDown (56)) And (KeyDown(208)) MoveEntity pivot ,0,0,-1
If KeyDown (56) And KeyDown (200) TurnEntity camera, -0.5,0,0
If KeyDown (56) And KeyDown (208) TurnEntity camera, 0.5,0,0
If KeyDown (29) And KeyDown (200) MoveEntity pivot, 0,1,0
If KeyDown (29) And KeyDown (208) MoveEntity pivot, 0,-1,0
If KeyDown (29) And KeyDown (203) TurnEntity pivot, 0,2,0
If KeyDown (29) And KeyDown (205) TurnEntity pivot, 0,-2,0

If KeyHit(30) MoveEntity light_2,1,0,0
If KeyHit(44) MoveEntity light_2,-1,0,0

UpdateWorld
RenderWorld
Flip
Until KeyHit(1)

End

По бокам от истоника света я создаю 4 кубика. По идее они иметь светлые грани, которые ближе всего к источнику, т.е. "смотрят на него", но светлые грани создаются с одной стороны, как будто источник света расположен где-то впереди кубов, а не в центре.

Артем Валерьевич 29.03.2010 12:42

Ответ: Меш, созданный вручную, проблема с освещением
 
Цитата:

light_2=CreateLight()
Какого типа источник света, думаю проблема в нем

а еще

Код:

light=CreateLight(2)
LightRange light,2



Часовой пояс GMT +4, время: 23:13.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot