Показать сообщение отдельно
Старый 02.12.2011, 00:33   #5
radiobutton
Бывалый
 
Регистрация: 16.09.2011
Сообщений: 863
Написано 257 полезных сообщений
(для 546 пользователей)
Ответ: Стандартное блицевское освещение

Сообщение от dsd Посмотреть сообщение


Type Wall
Field doors[100]
Field x,y,z,xd,yd,zd
Field mesh
End Type

Global MainCamera

Graphics3D 640,480
SetBuffer BackBuffer()
MoveMouse GraphicsWidth()/2,GraphicsHeight()/2

TestData()

light=CreateLight(1)
RotateEntity light,45,0,0
AmbientLight 127,127,127

;a=CreateCube()
;PositionEntity a, 0,3,0
;b=CreatePlane()
;EntityColor b,150,200,150

MainCamera = CreateCamera()
MoveEntity MainCamera, 0,1,-10
TurnEntity MainCamera,0,0,0

Repeat
b.wall = First wall
;TurnEntity b\mesh,0,0.3,0
UpdateCamera(MainCamera)
TurnEntity light,0,3,0
RenderWorld

Text 10,10,EntityRoll#(MainCamera)+" "+EntityYaw#(MainCamera)+" "+EntityPitch#(MainCamera)
Flip
Until KeyHit(1)
End

Function UpdateCamera(cam)
x#=MouseXSpeed()
y#=MouseYSpeed()
If MouseHit(2)
x#=0
y#=0
End If
If MouseDown(2)
RotateEntity cam,y/5.+EntityPitch#(cam),-x/5.+EntityYaw#(cam),0
If EntityPitch#(cam)>70
RotateEntity cam,70,EntityYaw#(cam),0
End If
If EntityPitch#(cam)<-70
RotateEntity cam,-70,EntityYaw#(cam),0
End If
MoveMouse GraphicsWidth()/2,GraphicsHeight()/2
End If

If KeyDown(17)
MoveEntity cam, 0,0,0.2
End If
If KeyDown(31)
MoveEntity cam, 0,0,-0.2
End If
If KeyDown(30)
MoveEntity cam, -0.2,0,0
End If
If KeyDown(32)
MoveEntity cam, 0.2,0,0
End If

End Function

Function AddPolyToSurf(x1#,x2#,x3#,y1#,y2#,y3#,z1#,z2#,z3#, d1#,d2#,d3#,surf)
v0 = AddVertex (surf,x1,x2,x3, 0 ,0)
v1 = AddVertex (surf,y1,y2,y3, 0.5,1)
v2 = AddVertex (surf, z1,z2,z3, 1 ,0)
tri = AddTriangle (surf,v0,v1,v2)

v0 = AddVertex (surf,x1,x2,x3, 0 ,0)
v1 = AddVertex (surf, z1,z2,z3, 0.5,1)
v2 = AddVertex (surf, d1,d2,d3, 1 ,0)
tri = AddTriangle (surf,v0,v1,v2)
End Function

Function AddCubeToSurf(x#,y#,z#,x1#,y1#,z1#,surf)
AddPolyToSurf(x,y,z,x,y+y1,z,x+x1,y+y1,z,x+x1,y,z, surf)
AddPolyToSurf(x,y,z,x,y,z+z1,x,y+y1,z+z1,x,y+y1,z, surf)
AddPolyToSurf(x,y,z,x+x1,y,z,x+x1,y,z+z1,x,y,z+z1, surf)
AddPolyToSurf(x,y,z+z1,x+x1,y,z+z1,x+x1,y+y1,z+z1, x,y+y1,z+z1,surf)
AddPolyToSurf(x+x1,y,z,x+x1,y+y1,z,x+x1,y+y1,z+z1, x+x1,y,z+z1,surf)
AddPolyToSurf(x,y+y1,z,x,y+y1,z+z1,x+x1,y+y1,z+z1, x+x1,y+y1,z,surf)
End Function

Function TestData()
a.wall = New wall
a\x=-7:a\y=-3:a\z=3
a\xd=15:a\yd=7:a\zd=1
a\doors[0]=3

a\doors[1]=1
a\doors[2]=1
a\doors[3]=2
a\doors[4]=3

a\doors[11]=5
a\doors[12]=2
a\doors[13]=3
a\doors[14]=4

a\doors[21]=10
a\doors[22]=1
a\doors[23]=2
a\doors[24]=5
CreateWall(a)
End Function

Function CreateWall(a.wall)
a\mesh = CreateMesh()
surf = CreateSurface(a\mesh)
x=a\x:y=a\y=a\z:x1=a\xd:y1=a\yd1=a\zd

AddPolyToSurf(x,y,z,x,y,z+z1,x,y+y1,z+z1,x,y+y1,z, surf)
AddPolyToSurf(x,y,z,x+x1,y,z,x+x1,y,z+z1,x,y,z+z1, surf)
AddPolyToSurf(x+x1,y,z,x+x1,y+y1,z,x+x1,y+y1,z+z1, x+x1,y,z+z1,surf)
AddPolyToSurf(x,y+y1,z,x,y+y1,z+z1,x+x1,y+y1,z+z1, x+x1,y+y1,z,surf)

xt=0
For i=1 To a\doors[0]
x2=a\doors[10*(i-1)+1]
y2=a\doors[10*(i-1)+2]
xd2=a\doors[10*(i-1)+3]
yd2=a\doors[10*(i-1)+4]
AddPolyToSurf(xt+x,y,z,xt+x,y+y1,z,x+x2,y+y1,z,x+x 2,y,z,surf)
AddPolyToSurf(xt+x,y,z+z1,x+x2,y,z+z1,x+x2,y+y1,z+ z1,xt+x,y+y1,z+z1,surf)
If y2+yd2<y1
AddPolyToSurf(x+x2,y+y2+yd2,z,x+x2,y+y1,z,x+x2+xd2 ,y+y1,z,x+x2+xd2,y+y2+yd2,z,surf)
AddPolyToSurf(x+x2,y+y2+yd2,z+z1,x+x2+xd2,y+y2+yd2 ,z+z1,x+x2+xd2,y+y1,z+z1,x+x2,y+y1,z+z1,surf)
End If
If y2>0
AddPolyToSurf(x+x2,y,z,x+x2,y+y2,z,x+x2+xd2,y+y2,z ,x+x2+xd2,y,z,surf)
AddPolyToSurf(x+x2,y,z+z1,x+x2+xd2,y,z+z1,x+x2+xd2 ,y+y2,z+z1,x+x2,y+y2,z+z1,surf)
End If

AddPolyToSurf(x+x2,y+y2+yd2,z,x+x2+xd2,y+y2+yd2,z, x+x2+xd2,y+y2+yd2,z+z1,x+x2,y+y2+yd2,z+z1,surf)
AddPolyToSurf(x+x2,y+y2,z,x+x2,y+y2,z+z1,x+x2+xd2, y+y2,z+z1,x+x2+xd2,y+y2,z,surf)

AddPolyToSurf(x+x2,y+y2,z,x+x2,y+y2+yd2,z,x+x2,y+y 2+yd2,z+z1,x+x2,y+y2,z+z1,surf)
AddPolyToSurf(x+x2+xd2,y+y2,z,x+x2+xd2,y+y2,z+z1,x +x2+xd2,y+y2+yd2,z+z1,x+x2+xd2,y+y2+yd2,z,surf)

xt=x2+xd2
Next
AddPolyToSurf(xt+x,y,z,xt+x,y+y1,z,x+x1,y+y1,z,x+x 1,y,z,surf)
AddPolyToSurf(xt+x,y,z+z1,x+x1,y,z+z1,x+x1,y+y1,z+ z1,xt+x,y+y1,z+z1,surf)
UpdateNormals a\mesh
End Function


Но вообще лучше нормали ручками ставить командой VertexNormal. Ибо автоматом оно для такой угловатой модели не то считает
Нормаль нада ставить так, чтобы она была перпендикулярна полигону в котором эта вершина?
(Offline)
 
Ответить с цитированием