学习[threejs] threejs和react-threejs

160 阅读1分钟

threejs 和react-three-fiber

现在的前端框架一般都具有高度的可扩展性,无论是vue,react在编译阶段都是基于AST生成目标平台的执行文件,据此使用react方式组织threejs的代码也就不奇怪了,将组件标签化还提高了效率,而且react16引入的fiber也是基于动画帧的定时扫描,我们使用threejs也是基于动画帧实现canvas渲染,这两者也存在一定关系,具体需要探究react-three-fiber源码

该项目的社区关注度也是相当高的,说明处于蓬勃发展期 image.png 本文也就根据threejs和react-three-fiber做一个横向的编写对比。

1. 场景创建

threejs

import {PerspectiveCamera, Scene, WebGLRenderer} from 'three'

const scene = new Scene()
const camera = new PerspecitiveCamera(75,window.innerWidth/window.innerHeight,0.1,1000)
// 背景透明
const render = new WebGLRenderer({alpha:true})
renderer.setSize(window.innerWidth,window.innerHeight)
function animation() {
    window.requestAnimationFargment(animation);
}

react-three-fiber

export default function App {
    return <>
    	<Canvas> // 场景自带相机
        <></>
    	</Canvas>
    </>
}

2 添加模型

const geometry = new BoxGeometry()
const material = new MeshBasicMaterial({color:0xff0000})
const box = new Mesh(geometry,material)
sence.add(box)
function App(){
    return <>
    	<Canvas>
    		<mesh>
        		<boxGeometry />
                <meshBasicMaterial />
        	</mesh>
    	</Canvas>
    </>
}

3 添加相机

const camera = new PerspectiveCamera(,,,)
scene.add(camera)
<Canvas camera={{xxx}}>
	<PerspectiveCamera />
</Canvas>

4 元素属性

const geometry = new BoxGeometry()
const material = new MeshBasicMaterial({color:0xff0000})
const mesh = new Mesh()
// 将元素作为属性添加到对象中
mesh.geometry = geometry
mesh.material = material
<mesh>
    <boxGeometry attach="geometry"/>
    <meshBasicMaterial attach="material"/>
</mesh>

更新

这个仓库应该是对fiber进行的扩展,确实是基于requestAnimationFrame实现的异步渲染

image.png