threejs第二天 把上一次的helloworld写上

本文介绍在Three.js中使用Vector3解决相机注视问题,通过实例代码展示如何正确设置相机注视目标,并实现动态文本与镜像效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

发现一个问题,相机注视目标必须用 three.vector3,否则相机不知道lookat谁去了!

上代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="threejsBuild/build/three.js" ></script>
    <style type="text/css">
        div#canvas-frame {
            border: none;
            cursor: pointer;
            width: 100%;
            height: 600px;
            background-color: #EEEEEE;
        }

    </style>

</head>
<body id="canvas-frame" >
<script>
    var renderer;
    var width=window.innerWidth;
    var height = window.innerHeight;
    function initThree() {

        renderer = new THREE.WebGLRenderer();
        renderer.setSize(window.innerWidth, window.innerHeight);

        document.body.appendChild(renderer.domElement);
        renderer.setClearColor(0x000000, 1.0);
    }

    var camera;
    function initCamera() {
        camera = new THREE.PerspectiveCamera(75, width / height, 1, 10000);
        camera.position.x = 100;
        camera.position.y = 0;
        camera.position.z = 0;
        camera.up.x = 0;
        camera.up.y = 0;
        camera.up.z = 1;


        var pos=new THREE.Vector3(0,0,0);

       // camera.lookAt(pos);
    }

    var scene;
    function initScene() {
        scene = new THREE.Scene();
    }

    var light;
    function initLight() {
        light = new THREE.DirectionalLight(0xFF0000, 1.0, 0);
        light.position.set(100, 100, 200);
        scene.add(light);
    }

    var cube;
    function initObject() {

        var geometry = new THREE.CubeGeometry(1,1,1);

        var material = new THREE.MeshBasicMaterial({color: 0x00ff00});
         cube = new THREE.Mesh(geometry, material);

        scene.add(cube);
        //camera.lookAt(cube.position);
    }


    var  text;
    var mirror;
    function initText(){
        var loader = new THREE.FontLoader();
        loader.load('threejsBuild/examples/fonts/helvetiker_bold.typeface.json',function(response){
            var font = response;
            var textGeometry = new THREE.TextGeometry("hello threejs!",{
                "font" : font,
                "size" : 70,
                "height" : 20,
                "bevelEnabled" : true,
                "bevelSize": 2
            })

            text = new THREE.Mesh(textGeometry,new THREE.MultiMaterial( [
                new THREE.MeshPhongMaterial( { color: 0xffffff, shading: THREE.FlatShading } ),
                new THREE.MeshPhongMaterial( { color: 0xffffff, shading: THREE.SmoothShading } )
            ] ))

            textGeometry.computeBoundingBox();

            var centerOffset = -0.5 * (textGeometry.boundingBox.max.x-textGeometry.boundingBox.min.x);
            text.position.x = centerOffset;
            text.position.y = 30;
            text.lookAt(camera.position);
            text.rotation.x = Math.PI;


             mirror = new THREE.Mesh(textGeometry,new THREE.MultiMaterial( [
                new THREE.MeshPhongMaterial( { color: 0xffffff, shading: THREE.FlatShading } ),
                new THREE.MeshPhongMaterial( { color: 0xffffff, shading: THREE.SmoothShading } )
            ] ));

            mirror.rotation.x = - Math.PI;
            mirror.position.x = centerOffset;
            mirror.position.z = 20;
            mirror.position.y = -30;
            scene.add(text);
            scene.add(mirror);
            mirror.lookAt(camera.position);
            camera.lookAt(text.position);
            var plane = new THREE.Mesh(
                new THREE.PlaneBufferGeometry( 10000, 10000 ),
                new THREE.MeshBasicMaterial( { color: 0xfffffff, opacity: 0.5, transparent: true } )
            );
            plane.rotation.x = -Math.PI/2;
            plane.position.y = 0;
            scene.add(plane);
        });
    }

    function render()
    {
        requestAnimationFrame(render);
       renderer.clear();

       //cube.rotation.y += 0.1;
        renderer.render(scene, camera);

    }
    function threeStart() {
        initThree();
        initCamera();
        initScene();
        initLight();
      //  initObject();
        initText();
        render();
    }
    threeStart();

</script>
</body>
</html>

后续将js文件单独提出来使用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值