【发布时间】:2016-03-11 02:29:07
【问题描述】:
我构建了锥体的 3D 模型。目前我做光。
黄点 - 太阳
粉红点 - 刻面中心
白点 - 法线末端
var light = new BABYLON.Vector3(120, 100, 0);
...
var currentFace = mesh.Facets[indexFaces];
var pixelA = this.project(currentFace.A, transformMatrix);
var pixelB = this.project(currentFace.B, transformMatrix);
var pixelC = this.project(currentFace.C, transformMatrix);
var normal1 = BABYLON.Vector3.Cross(pixelA, pixelB);
var normal2 = BABYLON.Vector3.Cross(pixelB, pixelC);
var normal3 = BABYLON.Vector3.Cross(pixelC, pixelA);
var center = pixelA.add(pixelB).add(pixelC).scale(1 / 3);
var normal = normal1.add(normal2).add(normal3).scale(1 / 3);
var end = center.add(normal.scale(5));
...
var lightDirection = light.subtract(center);
normal.normalize();
lightDirection.normalize();
var ndotl Math.max(0, BABYLON.Vector3.Dot(normal, lightDirection));
我做错了什么?
感谢您的提前!
附言作为基地,我拿了这个tutorial。
UPDATE-1
我重写了我的渲染方法,现在效果比以前好得多:
Device.prototype.render = function (cfg, mesh) {
var self = this,
normals = [], normal, center, end, color, ndotl, light = cfg.light.clone(),
pixelA, pixelB, pixelC, pixelWorldA, pixelWorldB, pixelWorldC, normalA, normalB, normalC,
viewMatrix, projectionMatrix, worldMatrix, worldViewTransformation, transformMatrix;
viewMatrix = BABYLON.Matrix.LookAtLH(cfg.camera.position, cfg.camera.target, BABYLON.Vector3.Up());
projectionMatrix = BABYLON.Matrix.PerspectiveFovLH(
cfg.perspective.fov / 180,
cfg.perspective.aspect,
cfg.perspective.znear,
cfg.perspective.zfar,
cfg.perspective.distance);
worldMatrix = BABYLON.Matrix.RotationYawPitchRoll(
cfg.rotation.y / 180,
cfg.rotation.x / 180,
cfg.rotation.z / 180).multiply(BABYLON.Matrix.Translation(
cfg.translation.x,
cfg.translation.y,
cfg.translation.z));
worldViewTransformation = worldMatrix.multiply(viewMatrix);
transformMatrix = worldViewTransformation.multiply(projectionMatrix);
mesh.facets.forEach(function (facet) {
pixelA = self.project(facet.a, transformMatrix);
pixelB = self.project(facet.b, transformMatrix);
pixelC = self.project(facet.c, transformMatrix);
pixelWorldA = BABYLON.Vector3.TransformCoordinates(facet.a, worldViewTransformation);
pixelWorldB = BABYLON.Vector3.TransformCoordinates(facet.b, worldViewTransformation);
pixelWorldC = BABYLON.Vector3.TransformCoordinates(facet.c, worldViewTransformation);
normalA = BABYLON.Vector3.Cross(pixelWorldA, pixelWorldB);
normalB = BABYLON.Vector3.Cross(pixelWorldB, pixelWorldC);
normalC = BABYLON.Vector3.Cross(pixelWorldC, pixelWorldA);
center = pixelA.add(pixelB).add(pixelC).scale(1 / 3);
normal = normalA.add(normalB).add(normalC).scale(1 / 3);
end = center.add(normal.scale(20000));
normals.push({start: center, end: end});
ndotl = self.computeNDotL(center, normal, light);
color = new BABYLON.Color4(ndotl * facet.color.r, ndotl * facet.color.g, ndotl * facet.color.b, ndotl * facet.color.a);
self.drawTriangle(pixelA, pixelB, pixelC, color);
});
self.present();
self.workingContext.fillStyle = "yellow";
self.workingContext.fillRect(light.x - 10, light.y - 10, 20, 20);
self.workingContext.strokeStyle = "#ffffff";
normals.forEach(function (p) {
var p1 = p.start;
var p2 = p.end;
self.workingContext.beginPath();
self.workingContext.moveTo(p1.x, p1.y);
self.workingContext.lineTo(p2.x, p2.y);
self.workingContext.stroke();
self.workingContext.fillStyle = "#ffffff";
self.workingContext.fillRect(p1.x - 2, p1.y - 2, 5, 5);
self.workingContext.fillStyle = "#ff00ff";
self.workingContext.fillRect(p2.x - 2, p2.y - 2, 5, 5);
});
};
在这段代码中,我添加了世界观矩阵。 我目前的结果:
你说,要隐藏锥形内部的红色区域,我可以使用 z-buffer。 但是...如何?
【问题讨论】:
-
我敢打赌,你的坐标系是正常的,光线是相反的,所以试试
var ndotl Math.max(0, - BABYLON.Vector3.Dot(normal, lightDirection));...只是添加了减号。你还在渲染中使用ndot照明强度吗? (您应该将面部颜色乘以它并渲染面部)
标签: javascript graphics 3d