html vue 3D之Three.js(第二节)

第一节:html vue 3D之Three.js(第一节)_加金开发的博客-CSDN博客

实列模型下载:https://download.csdn.net/download/qq_33131171/86246792

前面已近实现了加载obj的模型代码如下:

代码中包含了各种格式的模型-如果加载看不到模型,

1:相机位置

2:是否加载成功

3:相关的依赖是否引入

4:模型错误-更换模型

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<style>
    body {margin: 0;}
    canvas {width: 100%; height: 100% }
</style>
<body>
<div id="info">

</div>
</body>
<!--关键组件 必不可少-->
<script src="./js/build/three.js"></script>
<!--鼠标键盘 监听移动 OrbitControls-->
<script src="./js/examples/js/controls/OrbitControls.js"></script>

<!--加载OBJ格式模型库   OBJLoader-->
<!--加载mtl格式模型库   MTLLoader-->
<script src="./js/examples/js/loaders/MTLLoader.js"></script>
<script src="./js/examples/js/loaders/OBJLoader.js"></script>

<!-- 引入fbx模型加载库FBXLoader -->
<script src="./js/examples/js/loaders/FBXLoader.js"></script>
<!-- 辅助文件 -->
<script src="http://www.yanhuangxueyuan.com/versions/threejsR92/examples/js/libs/inflate.min.js"></script>
<script>
    /**
     * 创建一个场景
     */
    var scene = new THREE.Scene();//
    /**
     * 测试场景 在场景中画一个3D
     */
    // var geometry = new THREE.BoxGeometry(100, 100, 100); //创建一个立方体几何对象Geometry
    // var material = new THREE.MeshLambertMaterial({color: 0x0000ff}); //材质对象Material
    // var mesh = new THREE.Mesh(geometry, material); //网格模型对象Mesh
    // scene.add(mesh);

    /**
     * 辅助坐标系 辅助坐标系  参数250表示坐标系大小,可以根据场景大小去设置
     */
        //
    // var axisHelper = new THREE.AxisHelper(20);
    // scene.add(axisHelper);
    /**
     *  点光源2  位置和point关于原点对称
     */
    // var point2 = new THREE.PointLight(0xffffff);
    // point2.position.set(400, -200, -300); //点光源位置
    // scene.add(point2); //点光源添加到场景中

    /**
     * 光源设置
     */
    var point = new THREE.PointLight(0xffffff);
    point.position.set(400, 200, 300); //点光源位置
    scene.add(point); //点光源添加到场景中
    //环境光
    var ambient = new THREE.AmbientLight(0x444444);
    scene.add(ambient);
    /**
     * 相机设置-视角设置
     */
    var width = window.innerWidth; //窗口宽度
    var height = window.innerHeight; //窗口高度
    var k = width / height; //窗口宽高比
    var s = 2000; //三维场景显示范围控制系数,系数越大,显示的范围越大
    //创建相机对象
    var camera = new THREE.OrthographicCamera(-s * k, s * k, s, -s, 1, 2000);
    camera.position.set(50, 300, 400); //设置相机位置
    camera.lookAt(scene.position); //设置相机方向(指向的场景对象)
    /**
     * 透视投影相机设置
     */
    // var width = window.innerWidth; //窗口宽度
    // var height = window.innerHeight; //窗口高度
    // /**透视投影相机对象*/
    // var camera = new THREE.PerspectiveCamera(60, width / height, 1, 1000);
    // camera.position.set(200, 300, 200); //设置相机位置
    // camera.lookAt(scene.position); //设置相机方向(指向的场景对象)
    /**
     * 创建渲染器对象
     */
    var renderer = new THREE.WebGLRenderer();
    renderer.setSize(width, height);//设置渲染区域尺寸
    renderer.setClearColor(0xb9d3ff, 1); //设置背景颜色
    document.body.appendChild(renderer.domElement); //body元素中插入canvas对象
    //执行渲染操作   指定场景、相机作为参数
    renderer.render(scene, camera);
    /**
     * 监听移动
     */
    function render() {
        renderer.render(scene,camera);//执行渲染操作
    }
    render();
    var controls = new THREE.OrbitControls(camera,renderer.domElement);//创建控件对象
    controls.addEventListener('change', render);//监听鼠标、键盘事件

    /**
     * OBJ和材质文件mtl加载
     */
    // var OBJLoader = new THREE.OBJLoader();//obj加载器
    // var MTLLoader = new THREE.MTLLoader();//材质文件加载器
    // MTLLoader.load('./model/c/Anna_OBJ.mtl', function(materials) {
    //     // 返回一个包含材质的对象MaterialCreator
    //     console.log(materials);
    //     //obj的模型会和MaterialCreator包含的材质对应起来
    //     OBJLoader.setMaterials(materials);
    //     OBJLoader.load('./model/c/Anna_OBJ.obj', function(obj) {
    //         console.log(obj);
    //         obj.scale.set(10000, 10000, 10000); //放大obj组对象
    //         scene.add(obj);//返回的组对象插入场景中
    //     })
    // })
    /**
     * FBX 直接渲染
     */
    var mixer=null;//声明一个混合器变量
    var loader = new THREE.FBXLoader();//创建一个FBX加载器
    loader.load("./model/e/legend.fbx", function(obj) {
        // console.log(obj)
        scene.add(obj)
        obj.translateY(-20);
        // obj作为参数创建一个混合器,解析播放obj及其子对象包含的动画数据
        mixer = new THREE.AnimationMixer(obj);
        // 查看动画数据
        console.log(obj.animations)
        // obj.animations[0]:获得剪辑对象clip
        var AnimationAction=mixer.clipAction(obj.animations[0]);
        // AnimationAction.timeScale = 1; //默认1,可以调节播放速度
        // AnimationAction.loop = THREE.LoopOnce; //不循环播放
        // AnimationAction.clampWhenFinished=true;//暂停在最后一帧播放的状态
        AnimationAction.play();//播放动画
    })
    /**
     * 选中模型
     */
    var raycaster =renderer;
    var mouse = loader;

    function onMouseClick(event){
          console.log("dianji ")
        //将鼠标点击位置的屏幕坐标转换成threejs中的标准坐标
        mouse.x = (event.clientX/window.innerWidth)*2-1
        mouse.y = -((event.clientY/window.innerHeight)*2-1)
         console.log("mouse:"+mouse.x+","+mouse.y)

        // 通过鼠标点的位置和当前相机的矩阵计算出raycaster
        raycaster.setFromCamera( mouse, camera );

        // 获取raycaster直线和所有模型相交的数组集合
        var intersects = raycaster.intersectObjects( scene.children );
        console.log(intersects);

        //将所有的相交的模型的颜色设置为红色
        for ( var i = 0; i < intersects.length; i++ ) {
            intersects[ i ].object.material.color.set( 0xff0000 );
        }
    }
    document.addEventListener('click', onMouseClick);

</script>
</html>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

加金开发

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值