Бывалый
Регистрация: 16.09.2011
Сообщений: 863
Написано 257 полезных сообщений (для 546 пользователей)
|
Стандартное блицевское освещение
Собственно вопрос такой. Посмотрите на рисунок.
Как сделать такой свет чтобы полигоны расположенные в разных плоскостях освещались по разному, а не сливались в 1-ну плоскую двумерную фигуру.
Кому не понятно вот можете запустить этот код.
Двигать камеру на WASD. Крутить камеру можно зажав Правую клавишу мыши и двигая мышью.

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:z=a\z:x1=a\xd:y1=a\yd:z1=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+x2,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+y2+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+x1,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)
End Function
|