three.js用于从透视摄影机计算给定z深度处的可见宽度/高度的函数

这两个功能将为您提供场景中距透视摄影机给定距离处的可见高度和宽度。
如果您想要创建一个与场景全宽/全高相同的对象,或者想要将对象放置在屏幕边缘等,这将非常有用。
这里是代码=摄像机位置.z;如果(深度<;摄影机偏移)深度+=cameraOffset;//垂直视场英寸=可视高度(深度,相机);返回高度*照相机方面};
在网络上有很多这种功能的例子,但我没有看到任何补偿相机定位的功能。
注意,我只在相机朝向默认方向(即沿负z轴)和所考虑的深度沿轴更远,尽管我认为它在其他方向也会起作用。
你有这样的例子吗?我不确定我是否理解它应该这样做。
当然,看看这个代码笔,它显示了从相机不同深度绘制的全屏高度/宽度矩形。
啊,我明白了,但这只是为固定相机做的?
是的,但是如果您想用相机移动它们,只需将对象添加为相机的子对象,并将相机添加为场景的子对象。
在这里,白色和红色将随相机移动:
很好,您可能需要考虑用这样的东西制作一个节点模块就像require(\"three-camera-world-size\")(THREE)之后THREE.Camera将绑定您的函数。
太棒了,@looee
如果能看到更多的内容,那就太好了!
这正是我需要的,谢谢@looee!
也许我可以使用类似的技术来确定大小与屏幕上的物理像素匹配的平面(深度)?基本上是这个问题:我们如何使用屏幕像素来调整大小?
也许我必须进行二元搜索:将深度除以二,看看哪个中间平面更接近视口的大小,然后进入该区域并递归。这似乎是一种“我不懂数学,所以我只想搜索它”的方法。
我认为还有一种真正的方法可以解决这个问题,而不需要像二进制搜索这样的测试技术,但是我还不确定这可能是什么。
这里是一个二进制搜索,它(理论上)可以找到大小与视口像素匹配的深度:nfunction findScreenDepth( camera, renderer ) {const { near, = ( far - near ) / 2 + nearconst == physicalViewHeight ) // almost never happensreturn midpoint}}n,但结果并不像我希望的那样准确。在下面的代码笔中,您可以看到深度记录到控制台。
(在桌面上打开演示,确保可视区域的高度大于以下嵌入中的高度,否则红线不会显示)
如果您将红色框的高度值设置为与窗口的高度值匹配,您会注意到红色框略高于视口,您必须给它一个比窗口小一点的大小,以便它正好适合。
这可能是因为浮点错误?
如果不使用此二进制搜索,获得此深度的正确方法是什么?
不管怎样,如果我以编程方式为框的尺寸提供精确的浮点值,它几乎可以完美地工作:
这两行(基本上)大小相同。左边的蓝线是WebGL,右边的粉红线是绝对位于画布顶部的
(请参见元素检查器)。
两条线的高度都是50px。酷!
这是可行的,但我认为可能有更精确的方法。我也许可以用这个来绘制地图Three.jsObject3Ds到DOM坐标空间…
谢谢@looee,这有助于将某些东西与DOM对齐。
但由于某些原因,东西并没有完全居中。在本例中,您会看到DIV元素后面的teal正方形没有完全对齐:
我认为默认情况下Three.js把所有东西都完美地集中在一起,我想DOM也会这样做(使用我提供的CSS)。试图找出这种情况发生的原因…
对不起,我更新了最后一个示例:我从青色方块中删除了-5X位置。
但是,在上一个示例中,您仍然可以看到青色突出在粉色之外,但我希望它能准确地隐藏在粉色后面。也许有浮点错误?
如果我用-52%而不是-50%来翻译粉色方块,那么我可以设法掩盖青色方块:
我想知道为什么。
你在看嵌入的代码笔吗(即在对话网站上)?
嵌入式笔在调整大小方面做了一些奇怪的事情。如果我在一个新窗口中打开它,方块就会完全匹配。
!有趣!如果没有CSS透视图,它是完全匹配的。
什么时候有透视图?我需要研究浏览器的实现。我发现不管我应用哪个CSS透视图的值,只要透视图的值存在,偏移量总是相同的,所以它让我觉得有一些关于别名的东西在起作用。
这就是我下一步想弄清楚的:将CSS透视图与Three.js透视图,以便我可以同时变换网格和mesh.quaternion.setFromEuler( new THREE.Euler( - Math.PI / 2, 0, 0 ) );。也许这将有助于指出问题所在。
,在应用透视图时,这会影响div。让它成为ReferenceError: STLLoader is not defined init.js:127:16解决了问题!请参阅:
太棒了。现在我可以继续了!感谢您的<meta = new STLLoader();nAnd I Just started today with three.js so I am sorry for any dumb questions or problemsnMaybe you use in your code:nvar>nbut it should be:nvar>image.png1023×433 9.48 KBnyeah even after loading it with the link, it is still upside down. Mugen87:nMaybe you use in your code:nvar>nbut it should be:nvar>nYeah that was the problem for the error ! Wazaa:nyeah even after loading it with the link, it is still upside down.nThen try to rotate the mesh like proposed some comments above.nHow can I see the axes of the object ?nThis doesn\"t>ntopView.addObject()和scene.add(object)功能。
啊哈!再次查看后,我意识到不使用这些函数和二进制搜索,而是匹配Three.js透视图到CSS3d透视图可以归结为一个简短的=${perspective}pxn,下面是一个简单的示例。请注意,蓝色/粉色是由于在粉色DOM平面的顶部渲染teal WebGL平面(缩放相机以置换DOM元素后面渲染的WebGL):
此时,WebGL对象和DOM元素可以在同一3D空间中同时移动。例如,让我们对两者的位置和旋转设置动画(同样,如果缩放,您可以看到哪一个是WebGL,哪一个是DOM):
作为后续功能,还可以使用OrbitControls控制DOM的位置。
我需要这些功能,谢谢你
@looeee我不明白你为什么要在计算可见高度之前从深度中减去(或加上)相机的z位置。是否假定Euler在视图空间中给出?在哪个空间中,当Euler时减去AxesHelper并在THREE.Euler时加上THREE.Euler转换为视图空间总是正确的?n@trusktr使用二进制/二等分搜索所做的基本上是反转函数。查看精简功能(假设深度为正值,从视图空间原点和视图空间>
这是可逆的,只需将物体移动到>n Functions to calculate the visible width / height at a given z-depth from a perspective cameran

three.js[已解决]正交摄影机的变换控件:gizmos缩放问题

您好,我正在使用带轨道控制的正交摄影机。我注意到当缩放照相机变焦不改变相机的位置(如透视相机)。首先,我想知道为什么这两个相机的实现方式不同?第二,我也在使用TransformControls,对于透视摄影机,更新功能上的小控件的重新缩放在这个等式中非常有效>但是使用OrbitControls更改缩放而不是正交摄影机的位置时,它没有正常工作。我试着像这样在等式中添加缩放,但没有得到任何好的结果>我应该以不同的方式包括它吗?我应该使用其他控件吗?谢谢大家的帮助!NaDaMa:首先,我很想了解为什么这两个摄像头...

日期:2021-12-11 08:00:01 浏览:1717

three.js多次渲染同一模型(obj模型),FPS要低得多

我试图在程序中渲染150个相同的树模型,但FPS突然从60下降到30+。你能告诉我什么是最好的解决办法吗?非常感谢。和平与爱。skr有两种典型的方法可以解决这个性能问题(太多的绘制调用):- 使用实例化渲染- 将所有几何体合并为一个几何体(因此只有一个网格)...

日期:2021-12-11 08:00:02 浏览:1732

three.js可缩放场景背景

three.js大家好,我有一个场景,由一个物体(反射雕像)组成,保持在一个漂亮背景的中心。我一直在使用威尼斯日落矩形hdr地图作为我的场景背景它既可以作为环境地图,也可以作为背景我看到背景不会与场景中渲染的网格一起缩放。这给人一种场景完全是假的感觉。i、 e状态向上/向下缩放,但背景不缩放。目前,我已经禁用了放大/缩小功能,这样用户就不会感到害怕。我的问题是:1. 当轨道控制放大/缩小时,我是否需要在此处使用一些着色器魔法来放大或缩小场景背景,以便看起来场景中的所有对象都在均匀缩放?或者这根本不可能做到?...

日期:2021-12-11 09:00:02 浏览:1259

three.js移动导入的Gltf模型

three.js我导入了我的gltf模型并将其添加到场景中,但现在如果我尝试移动它,它将不会=新建三、几何();var=混音器( 模型动画[0]>如何移动模式?Prakar_Srivastava:var>3D对象不能是Geometry或BufferGeometry类型。它应该是Object3D或类似Mesh、Points或Line的派生类的实例。在您的情况下,我只是这样声明变量:var mode;在动画循环中,执行以下操作:如果(mod!==未定义)>还请记住,基本3D场景的重要部分在代码片段中丢失(例如相...

日期:2021-12-11 10:00:01 浏览:1091

three.js平面明暗处理的问题

three.js嗨!我在项目中使用节点材质。我在模型渲染方面有问题。它看起来像是真实的平面阴影。如何平滑多边形?也有点像低分辨率阴影纹理贴图的自阴影。可能不是,但可能是。@Arkadiy\\u Vinkovskiy您需要在您的帖子中添加更多细节。屏幕截图不足以说明这里发生了什么。始终包括引起问题的代码,如果您使用的是模型,也要包括这些代码。更好的是,使用codepe制作一个工作示例...

日期:2021-12-11 10:00:02 浏览:986

three.js如何渲染立方体材质?

您好,直到昨天,我才相信Object3D是一组网格,而网格是一组几何体+材质,每个对象只有一个对象。我发现了立方体材质的结构,因此object3D的网格包含1个几何体(boxGeometry)和6个材质!所以问题是,这种网格的渲染效果如何?有关于它的文件吗?(这是为了提高我对three.js)非常感谢还有其他问题,与我的上一个帖子相关,如果一个网格中可能有多个材质,如何设置CustomDistanceMaterial以考虑所有材质的所有贴图?elysium11:所以问题是,渲染如何在这种类型的网格上工作?您...

日期:2021-12-11 11:00:03 浏览:848

three.js如何创建要在网格中拟合的线段

three.js伙计们,我想帮忙,假设我有一个这样的网格图像718×729 1.25 KB我想在网格面内创建线段,也就是说,我想将网格转换成这样的线图像710×828 740字节有人能帮忙吗???...

日期:2021-12-11 12:00:01 浏览:897

three.jsGLTFLoader.js这是我的登记簿错误

three.js每当我试着做决定的时候3.GLTFLoader对象我收到此错误代码:“未捕获类型错误:这是我的登记簿不是一个函数“我需要帮助!由Penta#u Trax在post#5中解决我最终发现我一直在使用错误的文件,当你需要使用jsm/example时,我使用的是js/example。其他东西也是个问题。但这是问题的基础。你能给我们看看你的代码吗?通常,如果你使用的是import语句,GLTFLoader不需要在前面加三个字符。好的,所以在这之前,我刚刚关注了这个视频,因为它是去年发布的。但是现在我试...

日期:2021-12-11 12:00:02 浏览:1057

three.js使用threejs的光流

嘿,我需要通过我的屏幕显示一束移动的光束。我不想使用任何模型或动画。我想知道我是否可以单独使用threejs来实现这一点。我也应该能够控制其运动的颜色强度和路径。嗨!也许这会有帮助:GitHub-jeromeetienne/三倍体积聚光灯: three.js扩展以提供体积聚光灯13,用于可视化光锥。您可以使用THREE.Curve()设置其路径。控制颜色强度,可能取决于曲线上的位置,也可以使用tween.js或者GSAP用于复杂的动画。创造力取决于您这是您想要的吗?https://threejs.org/e...

日期:2021-12-11 13:00:01 浏览:1296

three.js使用光线投射动态绘制多边形

我要画多边形three.js具有交点。为此,我使用下面的函数。首先,我使用光线投射器在第一个交点的第一个点添加球体。每次单击后,在交点处创建新球体,并在该交点和上一点之间创建线。现在,我希望在第一次单击时关闭多边形指向或单击该点周围。如何实现此目标。raycaster params是否与网格一起工作以检测鼠标位置周围的网格?function checkIntersectionclick() = raycaster.intersectObjects(addedObject, true);if (interse...

日期:2021-12-11 13:00:02 浏览:855