Skip to content
Extraits de code Groupes Projets
Valider d2a25e7c rédigé par Sting's avatar Sting
Parcourir les fichiers

light class + shade function

parent 01bf7515
Aucune branche associée trouvée
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
...@@ -3,3 +3,4 @@ require("kara3d.matrix") ...@@ -3,3 +3,4 @@ require("kara3d.matrix")
require("kara3d.quaternion") require("kara3d.quaternion")
require("kara3d.transform") require("kara3d.transform")
require("kara3d.shape") require("kara3d.shape")
require("kara3d.light")
require("kara3d.vector")
require("kara3d.matrix")
require("kara3d.quaternion")
require("kara3d.transform")
require("utils")
light = {class = "light"}
light.__index = light
-- Creates a new light with transform t and RGB value diff and spec
function light.new(t, diff, spec)
local l = {transform = t, diffuse = diff or {255, 255, 255}, specular = spec or {255, 255, 255}}
setmetatable(l, light)
return l
end
-- Clones this light
function light:clone()
return light.new(self.transform, table.copy(self.diffuse), table.copy(self.specular))
end
\ No newline at end of file
...@@ -2,6 +2,7 @@ require("kara3d.vector") ...@@ -2,6 +2,7 @@ require("kara3d.vector")
require("kara3d.matrix") require("kara3d.matrix")
require("kara3d.quaternion") require("kara3d.quaternion")
require("kara3d.transform") require("kara3d.transform")
require("kara3d.lights")
require("utils") require("utils")
re = require("re") re = require("re")
...@@ -13,13 +14,22 @@ shape.__index = shape ...@@ -13,13 +14,22 @@ shape.__index = shape
face = {class = "face"} face = {class = "face"}
face.__index = face face.__index = face
-- Creates a new shape with transform t and faces f material = {class = "material"}
function shape.new(t, f) material.__index = material
local s = {transform = t, faces = f or {}}
setmetatable(s, shape)
return s
function material.new(a, d, sp, sh)
local m = {ambient = a or vector.new(3, {1, 1, 1}),
diffuse = d or vector.new(3, {1, 1, 1}),
specular = sp or vector.new(3, {1, 1, 1}),
shininess = sh or 1}
setmetatable(m, material)
return m
end end
-- Creates a new face with vertices c, normal n and tags t -- Creates a new face with vertices c, normal n and tags t
function face.new(v, n, t) function face.new(v, n, t)
local f = {vertices = v or {}, normal = n or -vector.cardinal(3, 3), tags = t} local f = {vertices = v or {}, normal = n or -vector.cardinal(3, 3), tags = t}
...@@ -27,6 +37,51 @@ function face.new(v, n, t) ...@@ -27,6 +37,51 @@ function face.new(v, n, t)
return f return f
end end
function face:mean()
sum = vector.zero(3)
for i = 1, #self.vertices do
sum = sum + self.vertices[i]
end
return (1/(#self.vertices)) * sum
end
function face:shade(mat, lights, ambient)
local Ka = mat.ambient
local Kd = mat.diffuse
local Ks = mat.specular
local shine = mat.shininess
local N = self.normal:normalized()
local P = self:mean():normalized()
local V = vector.new(3, {0, 0, -1})
local I = Ka * ambient
for i = 1, #lights do
local l = lights[i]
local L = (light.transform:position(true) - P):normalized()
local R = 2 * vector.dot(L, N) * N - L
-- Diffuse component
I = I + Kd * vector.dot(L, N) * l.diffuse
-- Specular component
I = I + Ks * math.pow(vector.dot(R, V), shine) * l.specular
end
return I
end
-- Creates a new shape with transform t and faces f
function shape.new(t, f)
local s = {transform = t, faces = f or {}}
setmetatable(s, shape)
return s
end
-- Clones this shape -- Clones this shape
function shape:clone() function shape:clone()
return shape.new(self.transform, table.copy(self.faces)) return shape.new(self.transform, table.copy(self.faces))
......
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Terminez d'abord l'édition de ce message.
Veuillez vous inscrire ou vous pour commenter