VertexNormal surface,index,nx#,ny#,nz#

Parameters

surface - surface handle
index - index of the vertex, from 0 to CountVertices( surface )-1
nx# - x component of the normal
ny# - y component of the normal
nz# - z component of the normal

Description

Sets the normal of an existing vertex.

The normal is the direction a vertex "faces" for lighting purposes. Give it a vector of length 1 - for example 0,1,0 for straight up.

For most meshes UpdateNormals works out sensible smooth normals automatically. Set them by hand when you want deliberate control: faking rounded edges on low-poly shapes, keeping a deformed mesh lit the way you want, or matching normals across seams between separate surfaces.

See also: UpdateNormals, VertexNX, VertexNY, VertexNZ, VertexCoords.

Example

; VertexNormal Example
; --------------------

; A vertex normal is the direction a vertex 'faces' for lighting.
; VertexNormal sets it by hand. The panel below never moves - only
; its normals swing - yet the changing brightness makes it look as
; if it were tilting into and out of the light.

Graphics3D 640,480
SetBuffer BackBuffer()

camera=CreateCamera()
PositionEntity camera,0,0,-4

; Directional light shining into the scene (along +z)
light=CreateLight()

panel=CreateMesh()
surf=CreateSurface(panel)

; A simple quad facing the camera
v0=AddVertex(surf,-1.5,1.5,0)
v1=AddVertex(surf,1.5,1.5,0)
v2=AddVertex(surf,1.5,-1.5,0)
v3=AddVertex(surf,-1.5,-1.5,0)
AddTriangle surf,v0,v1,v2
AddTriangle surf,v0,v2,v3

EntityColor panel,190,190,255

angle#=0

While Not KeyDown(1)

    ; [ and ] swing the normals left and right
    If KeyDown(26) And angle>-80 Then angle=angle-2
    If KeyDown(27) And angle<80 Then angle=angle+2

    ; Point every vertex normal the same way - the documented command.
    ; Straight at the camera (0,0,-1) is brightest; swung away is dark.
    nx#=Sin(angle)
    nz#=-Cos(angle)
    VertexNormal surf,v0,nx,0,nz
    VertexNormal surf,v1,nx,0,nz
    VertexNormal surf,v2,nx,0,nz
    VertexNormal surf,v3,nx,0,nz

    ; Arrow keys move the camera
    If KeyDown(200) Then MoveEntity camera,0,0,0.1
    If KeyDown(208) Then MoveEntity camera,0,0,-0.1
    If KeyDown(203) Then TurnEntity camera,0,1,0
    If KeyDown(205) Then TurnEntity camera,0,-1,0

    RenderWorld

    Text 0,0,"[ / ] : swing the normals   Arrow keys: move camera   Esc: exit"
    Text 0,20,"VertexNormal surf,v,"+nx+",0,"+nz
    Text 0,40,"The quad never moves - only its lighting changes"

    Flip

Wend

End

Index