threejs个人笔记

材质选择

从左往右依次对应

MeshBasicMaterial(基础材质,不受光照影响)
MeshStandardMaterial(PBR标准材质)
MeshPhongMaterial(高光材质,适用于陶瓷,烤漆类质感)
MeshToonMaterial(卡通材质,俗称三渲二)
MeshStandardMaterial(PBR标准材质模拟金属反射)

在这里插入图片描述

设置物体旋转方向和位置

 //设置位置
plane.position.x=10;
plane.position.y=10;
plane.position.z=10;

plane.position.set(10,10,10)

plane.position=new THREE.Vector3(10,10,10)
//缩放
plane.scale.set(0.5, 0.5, 0.5);
//旋转
plane.rotation.x = -0.5 * Math.PI;

plane.rotation.set(-0.5 * Math.PI,0,0)

plane.rotation=new THREE.Vector3(-0.5 * Math.PI,0,0)
//如果想使用度数(0到360)设置旋转。
var degrees=45
var inRadius=degree * (Math.PI/180)
//平移
plane.translateX(4)

获取模型长宽高

假设存在的Mesh对象,。我们可以创建一个BoundingBox并将其设置为mesh的BoundingBox:

var box = new THREE.Box3();
box.setFromObject( mesh );

使用box对象的getSize()方法来获取物体的宽度、高度和深度:

var size = new THREE.Vector3();
box.getSize( size );
console.log( "Width: " + size.x + ", Height: " + size.y + ", Depth: " + size.z );

另外,可以使用box对象的getCenter()方法来获取物体的中心点。这可以用于将其放置在屏幕中心等位置。

var center = new THREE.Vector3();
box.getCenter( center );
console.log( "Center: " + center.x + ", " + center.y + ", " + center.z );

最后,如果需要将物体缩放到指定的大小,可以使用scale属性:

var desiredSize = 10;
mesh.scale.set( desiredSize / size.x, desiredSize / size.y, desiredSize / size.z );

我们假设想要将物体的最大维度缩放到10。我们通过计算求得物体当前的尺寸,并计算缩放比例,然后将缩放应用于物体的scale属性中。

label鼠标事件

//鼠标移入
   labelModel.element.getElementsByClassName("label-style")[0].addEventListener("pointerenter", function (e) {
   })
//鼠标移出
pointerleave
//鼠标点击
pointerdown

显示渲染引擎当前处理的多边形数量

  console.log("Number of Triangles :", renderer.info.render.triangles);

获取模型中心点

在这里插入图片描述

  const geometry = new THREE.CylinderGeometry(10, 10, 200, 32);
  const material = new THREE.MeshBasicMaterial({
    color: 0xffff00 });
  const cylinder = new THREE.Mesh(geometry, material);
  cylinder.position.set(0, 100, 0);
  cylinder.name = "cylinder";
  scene.add(cylinder)

  const box = new THREE.Box3().setFromObject(cylinder)
  console.log(box);

  // geometry.computeBoundingBox()
  let boxHelper = new THREE.Box3Helper(box, 0xffff00);
  scene.add(boxHelper);

添加坐标轴

 var axes = new THREE.AxesHelper(20);
    scene.add(axes);

精灵材质报警效果

在这里插入图片描述

  let texture = new THREE.TextureLoader().load("../assets/img/j5.png");
  let material = new THREE.SpriteMaterial({
   
    //创建精灵材质
    map: texture, // 赋值贴图
    color: "#ff0000", // 设置颜色
    transparent: true, // 是否开启透明度
    opacity: 1, // 设置透明度
    depthWrite: false, // 深度写入
  });
  const sprite = new THREE.Sprite(material); //创建精灵,精灵永远朝向相机
  sprite.position.set(100, 100, 0);
  scene.add(sprite);

    let circle_n = 0;
  animate();
  function animate() {
   
    requestAnimationFrame(animate);
    circle_n = circle_n > 20 ? 0 : circle_n + 0.2;
    sprite.scale.set(0.5 * circle_n + 0.5, 0.5 * circle_n + 0.5, 0.5 * circle_n + 0.5);
    if (sprite.material) {
   
      sprite.material
  • 4
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
Three.js中,深度测试是用来确定哪些物体在渲染时应该显示在前面,哪些应该显示在后面的一种技术。默认情况下,深度测试是开启的,可以通过设置renderer的depthTest属性为false来关闭深度测试。例如,可以使用以下代码来创建一个开启了抗锯齿和对数深度缓冲的WebGL渲染器: ```javascript renderer = new THREE.WebGLRenderer({ antialias: true, logarithmicDepthBuffer: true }); ``` 另外,如果在使用Raycaster的intersectObject方法时遇到报错,可能是因为没有正确加载纹理。在加载纹理图片后,需要在图片加载完成后更新纹理,可以通过设置texture的needsUpdate属性为true来实现。例如: ```javascript var canvas = document.createElement("canvas"); var ctx = canvas.getContext('2d'); var Image = new Image(); Image.src = "./贴图.jpg"; Image.onload = function() { var bg = ctx.createPattern(Image, "no-repeat"); // ... // 注意图片加载完成执行canvas相关方法后,要更新一下纹理 texture.needsUpdate = true; } ``` 此外,如果想要在Three.js中使用orbitcontrol来控制模型的交互动作,并且希望绕x轴和z轴旋转,可以通过设置camera的up属性来实现。例如: ```javascript camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.1, 10000); camera.position.z = 2900; // 关键就是设置camera的up为y轴 camera.up = new THREE.Vector3(0, 0, 1); scene.add(camera); ``` 最后,如果在使用Three.js时遇到"A WebGL context could not be created. Reason: Web page caused context loss and was blocked"的错误,可能是由于WebGL上下文丢失导致的。这可能是由于浏览器的安全策略或其他原因引起的。可以尝试重新加载页面或检查浏览器的设置来解决这个问题。 #### 引用[.reference_title] - *1* *2* *3* [threejs坑记录-笔记](https://blog.csdn.net/u010568976/article/details/122562413)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

蛋蛋的老公

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

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

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

打赏作者

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

抵扣说明:

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

余额充值