three.js有限制的响应渲染器

如何调整渲染器(或摄影机)的大小以避免看到场景中不需要的部分?nstrong>我想达到与这个网站112完全相同的效果。
我已经在使用这个:n***0**是对我的canvas元素的引用,它的大小是100vw和100vh(使用CSS),所以它对我的code的作用与对你的完全相同。我制作了动画GIF来更精确地解释我想要的结果:
我现在拥有的东西:
我想要的东西:
正如你所看到的,第二个GIF中有一个特殊的行为,场景边界永远不会通过。我不知道这是否与相机或渲染器有关,或者两者都有关系。
我的意思是,您应该创建相应的图像/纹理/3dobject/任何对象”屏幕宽度“和”屏幕高度\". 你能在你创建场景的地方发布你的函数吗?
它使用一个名为PixiJS 12的2D引擎。它放置一个背景图像4和一个前景图像3,然后在鼠标移动时转换这两个图像以创建3D效果,这可能使用与示例17类似的代码。
若要回答此问题,可以尝试相对于画布宽度缩放场景。这将需要手动调整,因此我只能给出一个示例,但实际上类似于…nwindow.addEventListener(\"resize\", = (width-optimalWidth)/100 + 1; // change the 100 to something that suits your testing.}scene.scale.set(scale,scale,scale); // can change scene to your mesh here});n,尽管您可能也需要考虑高度,因此与其检查最佳宽度,不如检查宽度/高度之间的最佳比率,但目前这应该是一个不错的结果。
我理解,但我不是在说调整大小处理程序,您仍然可以改进,请检查照相机.镜头及.setsize,您应该会发现一些有用的关于堆栈溢出的文章。
无论如何
我给您举个例子,我有一个3d场景,其中我绘制了矩形来覆盖屏幕,从左到右,从下到上。在我的绘图功能中,我在屏幕宽度广袤屏幕高度高。
我什么意思?我的意思是,当你创建纹理时,你必须用屏幕属性而不是窗口属性来调整它的大小,不管浏览器有多大。这样,可以根据需要调整窗口大小,但第一次渲染将覆盖整个屏幕。我希望我解释得更好。我从来没有用过pixi,你认为这就是他们实现失真的原因吗?我可以看到它有点像一个密集的网格,但我还不能弄清楚它是什么,我仍在试图弄清楚spector js是如何工作的。
另一件事是前景3和背景1都有位移贴图,这也将用于3D.Soo将纹理映射到平面(如PlaneBufferGeometry),并使用置换贴图(GPU侧纹理)赋予它们深度。如果你觉得自己很勇敢,你可以取消源代码的完整性来看看,但这使得它很难阅读。n@ThoughtsRiff根据我对这个问题的理解,nagma
希望加载一个单一的模型一次,并在窗口调整大小时响应地调整3D视图比例,而不是根据初始视图重新绘制对象,这就是我的方法的基础。您可以根据视口设置初始化时的默认值/最佳大小,如果有人在桌面上或在移动设备上,这将适用,然后添加基于这些初始值的响应缩放。n@calrk我很惊讶网站是用Pixi完成的。我确信它是3D的。
我尝试了你的解决方案,它完成了部分工作(我看不到场景的左右边界),但我没有缩放整个视图(就像你在photoshop中所做的那样),而是让相机像东西一样移动:
它似乎与renderer.setViewport或renderer.setScissor有关,但我不确定。
我已经开始了我认为正确的方法是:nfunction onWindowResize() = width / height;if (actualRatio > optimalRatio) { // window too large// something to do maybe with renderer.setViewport, or setSize, or setScissor, and some math stuff using optimalRatio with width or height} else { // window too narrow// idem, but replacing the dimension (width or height) with the>nWhat I don\"t understand is if @nagman \"s texture/3d object has a fixed size that he can choose. Because if it is, when he creates the object he can sets its width and height as screen\"s ones. This way, when he resizes window from shrinked to wide, the texture/image gets to its original size ( as screen ) and doesn\"t stretch.nI\"m gonna create a codepen, I\"ll edit this reply.nEDIT 1: Notice also that if you use perspectiveCamera, FOV and distance are factors that you should count too.n@ThoughtsRiff I do use a perspectiveCamera, and this is why I cannot just set the size of the object.nIt shouldn\"t be that complicated. It is exactly the same effect as a simple object-fit: cover;在CSS中,或者abackground-size: cover;Three.js应该有类似“停止渲染超出此帧的所有内容”,而不必移动相机、其FOV、网格大小等。
是否可以发布您正在使用的完整示例代码,包括模型?哎哟,有点难,因为它在一个Next.js环境,但我可以试试。
您发布的示例似乎在处理图像,您似乎在处理网格。它们具有可用的宽度和高度,可以将其应用于逻辑。你没有这个,只有通过设置camera.fov来基本上有高度。
你需要的是与camera.fov和你的主题相关的东西,你需要以某种方式来框定它。您可以使用边界框、几何检查等等,但最简单的方法是选择一些世界大小的矩形,并将相同的逻辑应用于图像/四边形。
那么您的示例中发生了什么?
假设图像的纵横比为2:1。当您将窗口设置为1000px 500px时,它与图像完全对齐,没有溢出,两边都没有间隙。酷,让我们先把窗口缩小一点,500像素。
现在在500px 500px,我们在水平轴上有溢出。这很酷,这是THREE.PerspectiveCamera默认的行为方式。一秒钟内,我们将进一步介绍。
让我们调整它的大小,使其比图像更宽,1500px 500px。你在你的code中这样做,你会体验到在示例演示中被视为差距的东西。你会看到整个图像,两侧都有250px x 500px的间隙。
好的,我们不想看到,所以我们需要对图像做一些处理。我们希望图像“填满整个窗口”,因此它需要覆盖1500 x 500。它的纵横比是3:1,整个东西是2:1。我们希望图像宽度的1000px适合1500px,因此我们将图像放大1.5x。这给了我们750px的高度,我们只能适合500px。
如果图像位于网格上,n*const>nAnd if you picked some constant fov:n*const>nThere is only one ever position of the camera that would render this mesh to fit a 1000px x 500px>nSweet.Now when we apply the usual resize logic:nAnd we resize the screen to 500px x 500px we get your result. But when we go to 1500px x 500px we see gaps.nWe have:n500 x 5001000 x 5001500 x 500
让我们用500来划分所有这些:n*1x1 2x13x1/pre>
因此1/2的外观是理想的,并且与图像一致没有溢出或间隙。1x1有溢出,3x1有间隙。我们喜欢;1/2的行为。
这个怎么样?nif(aspect code>.setSize( 窗口宽度特别的?1 : = 三,数学,拉多德(阿坦数学(newH))>
小提琴:nhttps://jsfiddle.net/pailhead/qt5j2fbz/74因此,这是该示例的通用实现。您可以根据场景比例,通过反复试验找到这些数字,或者使用一些启发式方法来计算。@pailhead谢谢!!!你是我的救世主,
我不是什么都懂,但我的第一个考验是成功!
我认为使用fov会影响透视效果,但不会。
我将尝试为此写一篇文章,并附上一些插图。我觉得这种问题经常出现。我不喜欢一步一步地解释这个解决方案。n<nagman:npailhead:nblockquote
谭老师( 三,数学,德格托拉德(myFov/2))我想你在这一点上失去了我,我是我们学校数学课上最好的学生,但由于没有人告诉我这有什么用,我已经完全忘记了一切,你还说fov与身高有关吗?
Responsive renderer with limitsn

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

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

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

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

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

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

three.js可缩放场景背景

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

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

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 浏览:1099

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

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

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

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

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

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

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

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

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

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

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

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

three.js使用threejs的光流

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

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

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

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

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