Three.js零基础入门教程(郭隆邦)中顶点法向量数据光照计算案例,中立体效果不出来的问题解决

1.我一开始做的时候也是,跟着教程做的,死活不出效果

这是我当时的代码

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script src="http://www.yanhuangxueyuan.com/versions/threejsR92/build/three.js"></script>
    <!-- <script src=".././three.js-master/examples/js/controls/OrbitControls.js"></script> -->
    <script src="http://www.yanhuangxueyuan.com/threejs/examples/js/controls/OrbitControls.js"></script>
    <script>
        let scene = new THREE.Scene();
        let geometry = new THREE.BufferGeometry();
        let vertices = new Float32Array([
            0, 0, 0, //顶点1坐标
            50, 0, 0, //顶点2坐标
            0, 100, 0, //顶点3坐标

            0, 0, 0, //顶点4坐标
            0, 0, 100, //顶点5坐标
            50, 0, 0, //顶点6坐标
        ])
        geometry.attributes.position = new THREE.BufferAttribute(vertices, 3);
       

        var normals = new Float32Array([
            0, 0, 1, //顶点1法向量
            0, 0, 1, //顶点2法向量
            0, 0, 1, //顶点3法向量

            0, 1, 0, //顶点4法向量
            0, 1, 0, //顶点5法向量
            0, 1, 0, //顶点6法向量
        ]);
        // 设置几何体attributes属性的位置normal属性
        geometry.attributes.normal = new THREE.BufferAttribute(normals, 3); //3个为一组,表示一个顶点的法向量数据
        let material = new THREE.MeshBasicMaterial({
    
    
            color: 0x0000ff,
            side:THREE.DoubleSide

        });
        let point = new THREE.PointLight(0xffffff);
        point.position.set(400,200,300);
        scene.add(point)
        // console.log(geometry.attributes.normal,'geometry.attributes.normal')
        var ambient = new THREE.AmbientLight(0x444444);
        scene.add(ambient);
        let mesh = new THREE.Mesh(geometry, material);
        scene.add(mesh);
        // let ambient = new THREE.AmbientLight
        var axisHelper = new THREE.AxisHelper(250);
        scene.add(axisHelper);
        // let camera = new THREE.OrthographicCamera(-200*window.innerWidth/window.innerHeight,200*window.innerWidth/window.innerHeight,200,-200,1,1000);
        let camera = new THREE.OrthographicCamera(-200 * window.innerWidth / window.innerHeight, 200 * window.innerWidth / window.innerHeight, 200, -200, 1, 1000);
        camera.position.set(100, 40, 100);

        camera.lookAt(scene.position);
        // camera.setClearColor(0xb9d3ff,1);
        let renderer = new THREE.WebGLRenderer();
        renderer.setSize(window.innerWidth, window.innerHeight);
        renderer.setClearColor(0xb9d3ff, 1);
        document.body.appendChild(renderer.domElement);
        function rend() {
    
    
            renderer.render(scene, camera);
        }
        rend();
        let constrols = new THREE.OrbitControls(camera, renderer.domElement);
        constrols.addEventListener('change', rend)


    </script>
</body>

</html>

但是效果还是没有出来
解决的办法是,

1.我们使用的材质不对
2.添加的环境光和,点光不要是相同的颜色的光

1.使用的材质
在这里插入图片描述
所以这里不要使用MeshBasicMaterial的材质,因为他不受光照影响的材质

效果代码

    <script src="http://www.yanhuangxueyuan.com/versions/threejsR92/build/three.js"></script>
    <!-- <script src=".././three.js-master/examples/js/controls/OrbitControls.js"></script> -->
    <script src="http://www.yanhuangxueyuan.com/threejs/examples/js/controls/OrbitControls.js"></script>
let scene = new THREE.Scene() //创建一个场景
let geometry = new THREE.BufferGeometry();//创建一个缓冲几何;
let vertices = new Float32Array([
	0,0,0,
	50,0,0,
	0,100,0,
	0,0,0,
	0,0,100,
	50,0,0,
]);//保存几何体顶点的坐标
geometry.attributes.position = new THREE.BufferAttribute(vertices,3);//为缓冲几何添加位置;
let normals = new Float32Array([
	0,0,1,
	0,0,1,
	0,1,0,
	0,1,0,
	0,1,0,
])	
geometry.attributes.normal = new THREE.BufferAttribute(normals,3);
//为缓冲几何添加顶点法线量
let material = new THREE.MeshPhongMaterial({
    
    
	color:0x0000ff,
	side:THREE.DoubleSide
})//创建材质
let mesh = new THREE.Mesh(geometry,material);//创建出一个模型
scene.add(mesh);//为场景添加一个模型
let point = new THREE.PointLight(0xffffff);//创建一个点光源
point.position.set(400,200,300);//设置点光源的位置
scene.add(point);//向场景中添加点光源
let ambient = new THREE.AmbientLight(0x444444);//创建一个环境光
scene.add(ambient);//向场景中添加环境光
let camera = new THREE.OrthographicCamera(-200*window.innerWidth/window.innerHeight,200*window.innerWidth/window.innerHeight,200,-200,1,1000);
//创建一个相机
camera.position.set(100,40,100);//设置相机的位置
camera.lookAt(scene.position);//设置相机拍摄的位置;
let renderer = new THREE.WebGLRenderer();//创建一个渲染器
renderer.setSize(window.innerWidth,window.innerHeight);
renderer.setClearColor(0xb9d3ff,1);
document.body.appendChild(renderer.domElement);
function rend(){
    
    
	renderer.render(scene,camera);
}
rend()
let constrol = new THREE.OrbitControls(camera,renderer.domElement);
constrol.addEventListener('change',rend);

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/webMinStudent/article/details/113821549