我想在运行时修改 JSON 模型的展开(UV 坐标),以便在几何体表面移动纹理。我faceVertexUvs在Geometry 类文档中找到了。它包含一个数组,这是正确的。该数组包含很多元素,我假设它们是每个顶点的 UV 坐标。示例代码:
var uvs = mesh.geometry.faceVertexUvs[0];
console.log(uvs.length);
Run Code Online (Sandbox Code Playgroud)
给我4232作为输出。到目前为止,一切都很好。现在我想更改u和v值,但数组的 4000 多个元素都是字符串("1"到"4234")。我只找到了一些示例,展示了如何从头开始创建展开,在这种情况下,人们将 Vector2 数据推送到faceVertexUvs. 那么为什么我在那里看不到 Vector2 数据呢?
我的问题是关于texturecoordinate如何精确地映射到纹理中的纹素(不考虑过滤).
(0,0)例如是参考左上角像素的左上角还是参考左上角像素的中心?
如果使用近滤波,在纹理坐标(0.5,0.5)处获取什么像素?
怎么样(1.0,1.0),它是指右下角像素的右下角还是右下角像素的左上角?(我记得几年前,一些ATI和NVIDIA卡之间存在差异.它现在是标准化的吗?)
如果使用texelFetch()而不是textureLod(),访问像素的正确方法是什么?
是吗
ivec2 size = textureSize(sampler,0);
ivec2 iCoords = ivec2(int(uv.x*size.x),int(uv.y*size.y));
vec4 col = texelFetch(sampler,iCoords);
Run Code Online (Sandbox Code Playgroud)
或者可能
ivec2 iCoords = ivec2(int(uv.x*size.x+0.5f),int(uv.y*size.y+0.5f));
Run Code Online (Sandbox Code Playgroud)
正确?
甚至
ivec2 iCoords = ivec2(int(uv.x*(size.x+1)),int(uv.y*(size.y+1)));
Run Code Online (Sandbox Code Playgroud)
?
也许有人可以澄清映射究竟是如何工作的?
我在我的球体上有错误的纹理贴图.这个问题众所周知,但解决方案很少见.
这是我为球体生成UV的代码.
T =三角形,Nv =顶点法线.
for (int i=0; i<nbF; i++)
{
float tx1 = atan2(Nv[T[i].v1].x, Nv[T[i].v1].z) / (2.0f*M_PI) + 0.5f;
float ty1 = asinf(Nv[T[i].v1].y) / M_PI + 0.5f;
float tx2 = atan2(Nv[T[i].v2].x, Nv[T[i].v2].z) / (2.0f*M_PI) + 0.5f;
float ty2 = asinf(Nv[T[i].v2].y) / M_PI + 0.5f;
float tx3 = atan2(Nv[T[i].v3].x, Nv[T[i].v3].z) / (2.0f*M_PI) + 0.5f;
float ty3 = asinf(Nv[T[i].v3].y) / M_PI + 0.5f;
float n = 0.75f;
if(tx2 < n && tx1 > n)
tx2 += 1.0;
else if(tx2 > n …Run Code Online (Sandbox Code Playgroud) 我现在的情况是想使用VAO/VBO来回收相同的顶点并使用索引来加速渲染。
一切都很好,除了我的纹理模型使用 UV 坐标,并且对于相同的顶点(大约 >80%),我最终可能会根据我期望渲染的三角形获得不同的 UV 坐标(事实上,我正在使用md2 模型和纹理)。
对于老式的即时模式来说,这种渲染方式非常不错。现在,解决这个问题并通过 VAO/VBO 渲染的最佳方法是什么?
我想到的是分解三角形并创建具有重复顶点的非常大的 VBO,以便我可以将正确的 UV 坐标链接到每个“相同”。
我不得不说我不喜欢这个...有什么想法吗?
诗。对于不了解格式的人:如果您想使用纹理映射,我相信您必须使用基于要渲染的三角形的自定义 UV 坐标。否则纹理颜色都乱了!
我有一个高分辨率的房间多边形网格,我想提取顶点颜色信息并将它们映射为 UV 贴图,这样我就可以生成房间的纹理图集。
之后,我想重新划分模型的网格,以减少多边形的数量,并将高分辨率纹理以较低的分辨率映射到新的网格上。
到目前为止,我已经找到了在 Blender 中执行此操作的链接,但我想以编程方式执行此操作。您知道有什么库/代码可以帮助我完成任务吗?
我想首先我必须对模型进行分段(法线标准可能会有所帮助),然后切割每个网格段,这样我才能对其进行参数化。关于参数化,LSCM似乎为简单模型提供了良好的结果。一旦获得了纹理图集,我认为问题就变成了纹理映射的简单任务。
我的主要问题是分割和网格切割。我正在使用CGAL 库来实现此目的,但该算法太简单,无法切割复杂的形状。关于对房间大小的模型表现良好的更好的分割/切割算法有什么提示吗?
编辑:
该网格由 RGB-D 相机重建的房间组成,有 250 万个顶点和 470 万个面。重点是提取高分辨率纹理,重新网格化模型以减少多边形数量,然后将纹理重新映射到其上。它不是一个封闭的网格,并且由于重建而存在漏洞,所以我猜测我的任务是否根本无法完成。
我附上网格的捕获。
当图像作为纹理包裹在 3D 形状周围时,我试图将 THREE.js 中对象的位置从平面 2D 坐标(放置在 2D 图像上的注释)转换为 3D 坐标。这个想法是将一个小的 3D 对象放置在等效的 3D 坐标处来表示 2D 注释。
我可以通过获取与光线投射器相交的对象的 uv.x 和 uv.y 属性来执行相反的操作,这非常简洁。
上面的三项可能吗?我需要能够解释不同的形状几何形状。
我正在尝试在一个网格渲染器中使用多个重叠的图像层来制作 2D 游戏对象的动画。我有几层不同的纹理,每层都是具有透明背景的图像。
我找到了一种以编程方式创建矩形网格并使用 UV 映射对其中的材质进行分层的方法。不幸的是,Unity 现在必须单独渲染每个材质层,尽管它们都位于一个网格内。这会导致绘制调用的效率非常低。我可以看到每种材质现在也有自己的着色器。
我是否需要在 Unity 之外将所有图像编辑成一张巨大的图像,并在网格内的单一材质中使用 UV 映射来显示其中的一部分?
或者有什么方法可以通过着色器来实现这一点?
is there a way to show uv coords on gui like blender blender uv ?
我正在开发一种游戏,其中有许多相同纹理但不同长度/高度的墙壁.目前,我正在克隆基础纹理并为每个墙设置重复值.这会在内存中创建许多纹理.
我想要做的是改变平面uvs以适应纹理.我对此进行了一次尝试,得出了一些结果.
var X = 2000;
var Y = 1000;
var seg = Math.ceil(X/Y);
var wallgeo = new THREE.PlaneGeometry(X,Y,seg,1);
var uvs = [];
for(var i=0,len=wallgeo.faces.length;i<len;i+=2){
uvs.push([new THREE.Vector2(0,1),new THREE.Vector2(0,0),new THREE.Vector2(1,1)]);
uvs.push([new THREE.Vector2(0,0),new THREE.Vector2(1,0),new THREE.Vector2(1,1)]);
}
wallgeo.faceVertexUvs = [uvs];
wallgeo.uvsNeedUpdate = true;
var walltex = DDSLoader.load('materialmaptextures/21_2048.dds');
var wallmat = new THREE.MeshPhongMaterial({map:walltex, transparent:true, wireframe:false});
wall = new THREE.Mesh(wallgeo,wallmat);
wall.position.set(0,Y/2,-300);
scene.add(wall);
Run Code Online (Sandbox Code Playgroud)
你可以告诉我的问题是,为了创造一个额外的面孔,这不是一个大问题,但我真的想避免这种情况.最重要的是,如果平面长度不能被其高度整除,则纹理将拉伸/压缩.此外,其中的平面高度段是固定的,从而导致限制.
我不太关心创建额外的面孔.这有必要吗?一个人的脸可以每个三角形有多个紫外线吗?它需要吗?
我不熟悉Uv的问题,必须有一种有效的方法让我的墙壁看起来不荒谬而不会炸毁记忆,对吧?
在three.js示例“ webgl_rtt.html”中,可以看到:
varying vec2 vUv;
void main() {
vUv = uv;
gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
}
Run Code Online (Sandbox Code Playgroud)
在此示例中,未在任何.js文件中定义“ uv”,也未在three.js中定义“ uv”。显然,它是WebGL的一部分,但是它在哪里定义,关于它的文档在哪里以及还有哪些其他WebGL变量?