three.js几何体位置、大小是怎么算的呀?

发布于 2022-09-12 00:09:47 字数 3538 浏览 20 评论 0

image.png
几何体位置、大小是怎么算的呀?

import {

WebGLRenderer,

PerspectiveCamera,

Scene,

BoxGeometry,

MeshBasicMaterial,

Mesh,

AxesHelper,

AmbientLight

} from'../lib/three.module.js'

exportclassapp {

constructor(selector,op) {

this.op=op

this.init(selector)

    }

init(selector) {

this.container=this.getContainer(selector)

this.render=this.initRender()

this.scene=this.initScene()

this.camera=this.initCamera()

this.initBoxGeometry()

this.render.render(this.scene,this.camera)

    }

/**

     * 

     * @param{*}selector 承载元素

     * 返回承载对象和承载对象的宽高左右位置(width\height\left\top)

     */

getContainer(selector) {

selector=_query(selector)

return_getBox(selector)

    }

/**

     * 返回渲染对象 WebGLRenderer

     */

initRender() {

constrender=newWebGLRenderer({

            antialias:true,//抗锯齿

            alpha:true,// 透明

            logarithmicDepthBuffer:true// 对数深度缓存

        })

render.setPixelRatio(window.devicePixelRatio)// 指的是物理像素和设备独立像素的比  物理像素 / 设备独立像素(dips)

render.setSize(this.container.box.width,this.container.box.height)// 渲染的canvas宽高

this.container.el.appendChild(render.domElement)//添加到指定承载元素 默认元素:body

returnrender

    }

/**

     * PerspectiveCamera:透视摄像机 

     * 返回摄像机对象

     */

initCamera() {

constcamera=newPerspectiveCamera(

45,// 可视角度

this.container.box.width/this.container.box.height,// width / height,通常设置为canvas元素的高宽比

.1,// 近端距离

1000// 远端距离

)

camera.position.set(0,0,500)// camera所在位置

camera.lookAt(this.scene.position)// camera 看向场景中心的位置

returncamera

    }

/**

     * 返回场景对象

     */

initScene() {

returnnewScene()

    }

initBoxGeometry() {

constboxBuffer=[]

for(leti=0; i<1000; i++) {

constbox=newBoxGeometry(

Math.random()*20,

Math.random()*20,

Math.random()*20

)

constmaterial=newMeshBasicMaterial({

                color:Math.random()*0xffffff

            })

constcube=newMesh(box,material)

cube.position.x=Math.random()*800-400

cube.position.y=Math.random()*800-400

cube.position.z=Math.random()*800-400

boxBuffer.push(cube)

        }

this.scene.add(...boxBuffer)

    }

}

/**

 * 

 * @param{*}selector  element

 * return element or elements

 */

exportfunction_query(selector) {

if(!selector)returndocument.querySelector('body')

if(!typeofselector==='string')returnselector

if(selector.startsWith('#'))returndocument.querySelector(selector)

returnArray.from(document.querySelectorAll(selector))

}

/**

 * 

 * @param{*}container element

 * 

 *return container width\ height\ left\ top

 */

exportfunction_getBox(container) {

if(!container)return

if(!Array.isArray(container))return {

        el:container,

        box:container.getBoundingClientRect()

    }

returncontainer.map((

el=>({

el,

            box:el.getBoundingClientRect()

        })

))

}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文