ico网站图标/佛山企业用seo策略

ico网站图标,佛山企业用seo策略,那些免费网站做推广比较好,深圳市手机网站建设报价在项目开发过程中,笔者两次遇到同事的一个提问,我场景中的Line在相机旋转到某些角度或者移动到某些位置的时候会无故消失。由于业务场景复杂,所以这两位同事都是先花费了大量时间排查业务问题,然后才找我求助。这个问题抽象出来的…

在项目开发过程中,笔者两次遇到同事的一个提问,我场景中的Line在相机旋转到某些角度或者移动到某些位置的时候会无故消失。由于业务场景复杂,所以这两位同事都是先花费了大量时间排查业务问题,然后才找我求助。这个问题抽象出来的一个测试单元代码如下所示:

<!DOCTYPE html>
<html>
<head><meta charset="UTF-8"><title>threeLine</title><style>body {margin: 0;overflow: hidden;}</style><script src="three/build/three.js"></script><script src="three/examples/js/controls/OrbitControls.js"></script>
</head><body><script>var scene = new THREE.Scene();var geometry = new THREE.BufferGeometry();var material = new THREE.LineBasicMaterial({color: 0x000000, linewidth: 1});var line = new THREE.Line(geometry, material);scene.add(line);var width = window.innerWidth; var height = window.innerHeight; var k = width / height; var s = 200; var camera = new THREE.PerspectiveCamera(60, 1, 0.1, 20000);camera.position.set(100, 600, 300); camera.lookAt(0, 500, 400); var renderer = new THREE.WebGLRenderer();renderer.setSize(width, height);renderer.setClearColor(0xffffff, 1); document.body.appendChild(renderer.domElement); function render() {renderer.render(scene, camera);requestAnimationFrame(render);}render();var controls = new THREE.OrbitControls(camera,renderer.domElement);controls.addEventListener('change', render);var axisHelper = new THREE.AxesHelper(250);scene.add(axisHelper);	function onClick(){	var points = [new THREE.Vector3(0, -100, -100), new THREE.Vector3(0, -100, 100), new THREE.Vector3(0, 100, 100), new THREE.Vector3(0, 0, -100), new THREE.Vector3(0, -100, -100)];geometry.setFromPoints(points);}window.addEventListener("click", onClick);</script>
</body>
</html>

这是个绘图功能,通过在场景上点击鼠标在对应的位置上描点连线来显示绘制的轮廓。这里简化了一下,就在场景中心绘制一个固定尺寸的矩形。

然后我们试着通过滚轮把相机拉近拉远,奇怪的事情发生了,拉到比较近的时候线条突然无故消失,重新拉远又能看见了。

笔者本身就算不上精通three.js和WebGL,第一次遇到这个求助的时候也是花了不少时间在引擎源码上断点找问题。发现隐藏了它的代码在这里:

发现这根线就是被视锥剔除过滤掉了,three.js为了优化性能,会让不在画布可视范围(严格来说是个3D的视锥体)内的物体全部不参与渲染,这个线就是这样被过滤走的。

但是当时笔者没有细看,误以为只是视锥剔除算法为了性能而检测得比较粗糙,只检测了物体中心点,所以当时我给同事的解决方案是关闭线条的视锥剔除,代码如下:

line.frustumCulled = false;

设置以后,视锥剔除就会因为这个判断而不执行了:

有了经验之后,再有别的同事问我,我就三秒钟给他解决掉类似的问题。

视锥剔除(frustumCulled)默认值为true,这对于大多数物体来说都适用,引擎内唯一默认关闭的是InstancedMesh,多个相同几何体和材质的物体,可以通过这个对象进行合批渲染(减drawCall)来提升性能。开启这种物体的视锥剔除,很可能会因为合批的物体数量太大而增加cpu的开销,性能方面得不偿失。

言归正传,对于Line来说,关闭视锥剔除的代价是性能的下降。但是为了结果没办法。

然而这次写博客笔者才发现自己的这个做法是错误的,事实上three.js的视锥剔除并不是只检查中心点,而是检查了包围球,检测依据是球心和半径而并非只看中心点。

所以更地道的解决方案是:修改了线的顶点后,重新手动计算一次包围球,代码如下:

function onClick(){	var points = [new THREE.Vector3(0, -100, -100), new THREE.Vector3(0, -100, 100), new THREE.Vector3(0, 100, 100), new THREE.Vector3(0, 0, -100), new THREE.Vector3(0, -100, -100)];geometry.setFromPoints(points);//更新包围球,确保视锥剔除的结果准确无误geometry.computeBoundingSphere();
}

简单小结一下:

解决线条乃至其他物体在某些角度下消失的方法有两种:

1 把物体的视锥剔除关闭

2 物体的包围球发生变更时重新手动计算一次

物体的几何信息变更频繁的话适合方案1,否则选择方案2。

可以看到,three.js出于性能考虑,没有把修改顶点和更新包围球两个操作合并到一个方法中,这会让萌新们觉得three.js学习门槛高,易用性差,或者bug很多。

而事实上,three.js是在易用性和性能之间寻求一个平衡点。而且这些东西只要踩过一次坑,后面再遇到类似问题的时候就会更加得心应手。

这也是笔者创作这一专栏的初衷,如果你们有幸在首次遇到这方面问题的时候能够通过搜索引擎找到笔者的文章,那也许第一次踩坑就能快速解决问题了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/68167.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微信小程序-点餐(美食屋)02开发实践

目录 概要 整体架构流程 &#xff08;一&#xff09;用户注册与登录 &#xff08;二&#xff09;菜品浏览与点餐 &#xff08;三&#xff09;订单管理 &#xff08;四&#xff09;后台管理 部分代码展示 1.index.wxml 2.list.wxml 3.checkout.wxml 4.detail.wxml 小结优点 概要…

windows git bash 使用zsh 并集成 oh my zsh

参考了 这篇文章 进行配置&#xff0c;记录了自己的踩坑过程&#xff0c;并增加了 zsh-autosuggestions 插件的集成。 主要步骤&#xff1a; 1. git bash 这个就不说了&#xff0c;自己去网上下&#xff0c;windows 使用git时候 命令行基本都有它。 主要也是用它不方便&…

CDN、源站与边缘网络

什么是“源站” 源服务器 源服务器的目的是处理和响应来自互联网客户端的传入请求。源服务器的概念通常与边缘服务器或缓存服务器的概念结合使用。源服务器的核心是一台运行一个或多个程序的计算机&#xff0c;这些程序旨在侦听和处理传入的客户端请求。源服务器可以承担为网…

无人机 PX4 飞控 | PX4源码添加自定义参数方法并用QGC显示与调整

无人机 PX4 飞控 | PX4源码添加自定义参数方法并用QGC显示与调整 0 前言 之前文章添加了一个自定义的模块&#xff0c;本篇文章在之前的自定义模块中&#xff0c;添加两个自定义参数 使用QGC显示出来&#xff0c;并通过QGC调整参数值&#xff0c;代码实现参数更新 新增的参…

RabbitMQ 分布式高可用

文章目录 前言一、持久化与内存管理1、持久化机制2、内存控制1、命令行2、配置文件 3、内存换页4、磁盘控制 二、集群1、Erlang的分布式特性2、RabbitMQ的节点类型2.1、磁盘节点 (Disk Node)2.2、内存节点 (RAM Node) 3、构建集群3.1 普通集群3.2 镜像队列3.3、高可用实现方案3…

【JS|第28期】new Event():前端事件处理的利器

日期&#xff1a;2025年1月24日 作者&#xff1a;Commas 签名&#xff1a;(ง •_•)ง 积跬步以致千里,积小流以成江海…… 注释&#xff1a;如果您觉得有所帮助&#xff0c;帮忙点个赞&#xff0c;也可以关注我&#xff0c;我们一起成长&#xff1b;如果有不对的地方&#xf…

IDEA工具下载、配置和Tomcat配置

1. IDEA工具下载、配置 1.1. IDEA工具下载 1.1.1. 下载方式一 官方地址下载 1.1.2. 下载方式二 官方地址下载&#xff1a;https://www.jetbrains.com/idea/ 1.1.3. 注册账户 官网地址&#xff1a;https://account.jetbrains.com/login 1.1.4. JetBrains官方账号注册…

技术总结:FPGA基于GTX+RIFFA架构实现多功能SDI视频转PCIE采集卡设计方案

目录 1、前言工程概述免责声明 3、详细设计方案设计框图SDI 输入设备Gv8601a 均衡器GTX 解串与串化SMPTE SD/HD/3G SDI IP核BT1120转RGBFDMA图像缓存RIFFA用户数据控制RIFFA架构详解Xilinx 7 Series Integrated Block for PCI ExpressRIFFA驱动及其安装QT上位机HDMI输出RGB转BT…

HTML<kbd>标签

例子 在文档中将一些文本定义为键盘输入&#xff1a; <p>Press <kbd>Ctrl</kbd> <kbd>C</kbd> to copy text (Windows).</p> <p>Press <kbd>Cmd</kbd> <kbd>C</kbd> to copy text (Mac OS).</p>…

奇怪的单词(快速扩张200个单词)

这是一些非常奇怪的单词&#xff1a; screw n.螺丝&#xff1b;螺丝钉 screwdriver n.起子&#xff0c;螺丝刀&#xff0c;改锥 copulation n.连接 copulate a.配合的 bonk n.撞击&#xff1b;猛击 v.轻击&#xff1b;碰撞ebony n.黑檀couple n.夫妇blonde n.金发女郎intimacy…

【PostgreSQL内核学习 —— (WindowAgg(一))】

WindowAgg 窗口函数介绍WindowAgg理论层面源码层面WindowObjectData 结构体WindowStatePerFuncData 结构体WindowStatePerAggData 结构体eval_windowaggregates 函数update_frameheadpos 函数 声明&#xff1a;本文的部分内容参考了他人的文章。在编写过程中&#xff0c;我们尊…

[STM32 - 野火] - - - 固件库学习笔记 - - -十二.基本定时器

一、定时器简介 STM32 中的定时器&#xff08;TIM&#xff0c;Timer&#xff09;是其最重要的外设之一&#xff0c;广泛用于时间管理、事件计数和控制等应用。 1.1 基本功能 定时功能&#xff1a;TIM定时器可以对输入的时钟进行计数&#xff0c;并在计数值达到设定值时触发中…

Python数据可视化(够用版):懂基础 + 专业的图表抛给Tableau等专业绘图工具

我先说说文章标题中的“够用版”啥意思&#xff0c;为什么这么写。 按照我个人观点&#xff0c;在使用Python进行数据分析时&#xff0c;我们有时候肯定要结合到图表去进行分析&#xff0c;去直观展现数据的规律和特定&#xff0c;那么我们肯定要做一些简单的可视化&#xff0…

【C++】特殊类设计、单例模式与类型转换

目录 一、设计一个类不能被拷贝 &#xff08;一&#xff09;C98 &#xff08;二&#xff09;C11 二、设计一个类只能在堆上创建对象 &#xff08;一&#xff09;将构造函数私有化&#xff0c;对外提供接口 &#xff08;二&#xff09;将析构函数私有化 三、设计一个类只…

Jetpack Compose 和 Compose Multiplatform 还有 KMP 的关系

今天刚好看到官方发布了一篇文章&#xff0c;用于讨论 Compose Multiplatform 和 Jetpack Compose 之间的区别&#xff0c;突然想起之前评论区经常看到说 “Flutter 和 CMP 对于 Google 来说项目重叠的问题”&#xff0c;刚好可以放一起聊一聊。 最近写的几篇内容写的太干&…

ICSE‘25 LLM Assistance for Memory Safety

不知道从什么时候开始&#xff0c;各大技术社区&#xff0c;技术群聊流行着 “用Rust重写!” &#xff0c;放一张图(笑死… 这不, 随着大模型技术的流行&#xff0c;大家都在探索如何让大模型自动完成仓库级别(全程序)的代码重构&#xff0c;代码变换&#xff08;Refactor&…

TRTC实时对话式AI解决方案,助力人机语音交互极致体验

近年来&#xff0c;AI热度持续攀升&#xff0c;无论是融资规模还是用户热度都大幅增长。2023 年&#xff0c;中国 AI 行业融资规模达2631亿人民币&#xff0c;较2022年上升51%&#xff1b;2024年第二季度&#xff0c;全球 AI 初创企业融资规模为 240 亿美金&#xff0c;较第一季…

Android多语言开发自动化生成工具

在做 Android 开发的过程中&#xff0c;经常会遇到多语言开发的场景&#xff0c;尤其在车载项目中&#xff0c;多语言开发更为常见。对应多语言开发&#xff0c;通常都是在中文版本的基础上开发其他国家语言&#xff0c;这里我们会拿到中-外语言对照表&#xff0c;这里的工作难…

最新最详细的配置Node.js环境教程

配置Node.js环境 一、前言 &#xff08;一&#xff09;为什么要配置Node.js&#xff1f;&#xff08;二&#xff09;NPM生态是什么&#xff08;三&#xff09;Node和NPM的区别 二、如何配置Node.js环境 第一步、安装环境第二步、安装步骤第三步、验证安装第四步、修改全局模块…

Greenplum临时表未清除导致库龄过高处理

1.问题 Greenplum集群segment后台日志报错 2.回收库龄 master上执行 vacuumdb -F -d cxy vacuumdb -F -d template1 vacuumdb -F -d rptdb 3.回收完成后检查 仍然发现segment还是有库龄报警警告信息发出 4.检查 4.1 在master上检查库年龄 SELECT datname, datfrozen…