Three 解决加载模型闪烁
Posted aichitudousien
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Three 解决加载模型闪烁相关的知识,希望对你有一定的参考价值。
@
概述
在一次使用 three加载模型中遇到模型闪烁严重的问题,相机拉得越远模型闪烁越厉害,出现此问题的原因是因为出现了深度问题,以下记录解决办法
解决方法
- WebGLRenderer开启logarithmicDepthBuffer
logarithmicDepthBuffer 的定义:
logarithmicDepthBuffer - 是否使用对数深度缓存。如果要在单个场景中处理巨大的比例差异,就有必要使用。 默认是false。
renderer.logarithmicDepthBuffer = true;
- 可以强制设置相机的渲染范围,越小越好
- 将加载的模型等比例的缩小
- 可以对模型的材质进行偏移
以上4中方法都可解决模型闪烁的问题,我采取的是将模型尽可能的缩小和设置相机的范围。
three.js 给模型添加标注
参考技术A 1. 需要有一个被选择的mesh,通过raycaster获取2. 创建先和一个平面
3. 将线和标注的面放在获取的mesh上
var mouse =new THREE.Vector2();
var raycaster =new THREE.Raycaster();
mouse.x = (event.clientX / domElement.width) *2 -1;
mouse.y = -(event.clientY / domElement.height) *2 +1;
raycaster.setFromCamera(mouse, camera);
var intersects = raycaster.intersectObjects(scene.children, false); //
selectedObject = intersects[0].object; // 被选中的标注对象
//
var startP,endP;// 这里也是通过raycaster获取到的
var color = parameters.hasOwnProperty("color") ? parameters.color :0x0000ff;
var lineMat =new THREE.LineBasicMaterial(
"color": 0xff0000
);
var lineGeo =new THREE.Geometry();
lineGeo.vertices.push(startPos);
lineGeo.vertices.push(endPos);
var line =new THREE.Line(lineGeo, lineMat);
// 初始化一个sprite,这是一个始终面向相机的平面,
var sprite = new textSprite(这并不是一个构造函数,不想写那么多,自行去官网查看)
.......
sprite.scale.set(_spriteScale, _spriteScale, _spriteScale); // 设置的是sprite的大小
selectedObject.add(line); // 添加
line.worldToLocal(_endPos); // 设置点
sprite.position.copy(_endPos); // 设置sprite的位置
line.add(sprite); 添加并进行关联
注: sprite可以用于进行标注热点等操作,具体实现较为简单,同时因为也算是mesh,所以sprite可以设置texture,使用图片作为背景等,也可以把一个canvas,把需要的文字图片等都加入进来.
以上是关于Three 解决加载模型闪烁的主要内容,如果未能解决你的问题,请参考以下文章
three.js加载stl模型文件,怎么能让模型大小一致并居中