threejs的控制器 立方体空间 基本控制器+惯性控制+飞行控制

threejs的控制器 立方体空间 基本控制器+惯性控制+飞行控制

import React, {Component} from 'react';
import * as THREE from "three";
import {OrbitControls} from "three/examples/jsm/controls/OrbitControls";
// import {reflect} from "three/examples/jsm/nodes/shadernode/ShaderNodeBaseElements";
// import {Refractor} from "three/examples/jsm/objects/Refractor";
// import {Reflector} from "three/examples/jsm/objects/Reflector";
//更加 有惯性的OrbitControls 的升级基本
import {TrackballControls} from "three/examples/jsm/controls/TrackballControls";
//飞行控制 鼠标操作视角 的前进和方向
import {FlyControls} from "three/examples/jsm/controls/FlyControls";

const clock=new THREE.Clock()
class Index extends Component {
    ready:false
    constructor(args) {
        super(args);
        this.state={
            width:window.innerWidth,
            height:window.innerHeight,
            count:0,
        }
        this.ballpoi={
            x:0,
            y:100,
            z:0,
            vx:(Math.random()-0.5)*7,
            vy:(Math.random()-0.5)*7,
            vz:(Math.random()-0.5)*7
        }
    }
    render() {
        return (
            <div className={'three-canvas'}>
            </div>
        );
    }
    componentDidMount() {
        if(this.state.count===0){
            this.init()
            // eslint-disable-next-line react/no-direct-mutation-state
            this.state.count++

        }

    }
    getRenderer(){
        //设置
        const renderer=new THREE.WebGLRenderer()
        renderer.setSize(this.state.width,this.state.height)
        document.querySelector('.three-canvas').appendChild(renderer.domElement)
        return renderer
    }
    getCamera(){
        const camera=new THREE.PerspectiveCamera(75,this.state.width/this.state.height,1,1000)
        camera.position.z=400
        camera.lookAt(0,0,0)
        return camera
    }
    getScene(){
        const scene=new THREE.Scene()
        return scene
    }
    getControl(){
        const control=new FlyControls(this.camera,this.renderer.domElement)
        control.movementSpeed=50
        control.autoForward =false
        control.rollSpeed=0.5
        return control
    }
    addLight(){
        //环境光
        const light = new THREE.AmbientLight( 0xffffff,0.5);
        const pointLight = new THREE.PointLight( 0xffffff,1);
        pointLight.position.set(0,0,0)
        pointLight.castShadow=true
        this.scene.add( light ,pointLight);
    }

    addPlane(){
        const geometry=new THREE.BoxGeometry(Math.random()*10,Math.random()*10,Math.random()*10)
        const material = new THREE.MeshNormalMaterial({side: THREE.DoubleSide})
        const box= new THREE.Mesh(
            geometry,
            material
        )
        box.rotation.set(Math.PI/(Math.random()*10),Math.PI/(Math.random()*10),Math.PI/(Math.random()*10))
        box.position.set((Math.random()-0.5)*300,(Math.random()-0.5)*300,(Math.random()-0.5)*300)
        this.scene.add(box)
        return box
    }
    init(){
        //创建rander --相机 ---场景----动画
        this.renderer=this.getRenderer()
        this.camera=this.getCamera()
        this.scene=this.getScene()
        this.scene.background=new THREE.Color('#d1b8b8')
        for (let i=0;i<400;i++){
            this.addPlane()
        }
        //添加灯光
        this.addLight()
        //添加控制器
        this.control=this.getControl()
        //执行动画
        this.animation()
    }

    animation(){
        requestAnimationFrame(this.animation.bind(this))
        this.renderer.render(this.scene,this.camera)
        this.control.update(clock.getDelta())
    }
}

export default Index;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值