我有一个快速问题。我想知道是否可以在 python 中执行 UV/纹理映射。我知道我可能需要导入一两个模块。但我没有太多关于如何在 python 中执行 UV/纹理映射的示例。
如果可能的话有人可以发布一个例子。最终我想要做的是导入在 3D 程序(例如 Blender 或 3D Max)中创建的 3D 模型,然后我需要将数据应用到该 3D 模型的表面。数据将采用矩阵或数组的形式。我知道 UV/纹理贴图可以帮助使这个过程变得更容易,这就是我对此感到好奇的原因。
嘿伙计们,我是游戏编程和图形编程的新手.但是,我急切地希望学习,所以我已经开始用OpenGL构建游戏引擎.我已经实现了所有基本的图形功能,现在我想为我的三角形网格添加纹理支持.
我能找到的纹理映射的唯一教程是针对单个多边形 - 如何定义包裹整个网格的纹理?
我使用lib3ds(http://code.google.com/p/lib3ds/)从.3ds文件加载网格..3ds文件带有一些纹理坐标数据吗?
谢谢!
我有一个我在3ds Max中创建的模型.该模型是一个简单的矩形.它的纹理具有重叠的纹理坐标 - 模型应该并排显示图像文件的右半部分两次.我将此模型导出为.obj,并使用Microsoft Expression Blend将其转换为XAML.
我MeshGeometry3D从混合中取出,并Viewport3D使用两种方法将其添加到:
Viewport2DVisual3D具有Label作为Visual.将Label背景设置为纹理图像.使用此方法,一切都按预期工作.ModelVisual3D具有GeometryModel3D作为Content.将GeometryModel3D材质设置为DiffuseMaterial使用图像作为其画笔的材质.使用这种方法,TextureCoordinates的MeshGeometry3D似乎是不同的解释.完整代码如下.代码隐藏是空的,除了InitializeComponent():
<Window x:Class="TestTextureCoordinates.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<Grid.Resources>
<MeshGeometry3D x:Key="geometry"
Normals="0,0,1 0,0,1 0,0,1 0,0,1 0,0,1 0,0,1 0,0,1 0,0,1"
Positions="113.8997,102.4171,0 148.9045,102.4171,0 148.9045,148.41161,0 113.8997,148.41161,0 184.5722,102.4171,0 184.5722,148.41161,0 148.9045,148.41161,0 148.9045,102.4171,0"
TextureCoordinates="0.50639999,0.9995 1.0065,0.9995 1.0065,0.00050002337 0.50639999,0.00050002337 1.0022,0.9995 1.0022,0.00050002337 0.5,0.00050002337 0.5,0.9995"
TriangleIndices="0 1 2 0 2 …Run Code Online (Sandbox Code Playgroud) 尝试将UV坐标映射到球体时,我遇到以下问题

这是我用来获取UV坐标的代码
glm::vec2 calcUV( glm::vec3 p)
{
p = glm::normalize(p);
const float PI = 3.1415926f;
float u = ((glm::atan(p.x, p.z) / PI) + 1.0f) * 0.5f;
float v = (asin(p.y) / PI) + 0.5f;
return glm::vec2(u, v);
}
Run Code Online (Sandbox Code Playgroud)
在这个stackoverflow问题上很好地解释了这个问题,尽管如此,我仍然没有得到如何修复它.从我读过的内容来看,我必须创建一对重复的顶点.有谁知道一些好的和有效的方式吗?
和ThreeJS一起玩时,我遇到了一个非正方形四边形纹理的经典问题:http ://www.xyzw.us/~cass/qcoord/
问题是ThreeJS只允许您使用vec2设置纹理坐标(据我所知..),并花了几个小时,最后找到了一个可行的解决方案,我想与社区分享它,也许能得到一些更好的主意? 所以这是代码:
首先,使用三个JS制作我的Quad的javascript:
var planeGeom = new THREE.Geometry();
planeGeom.vertices.push(new THREE.Vector3(0, 0, 10));
planeGeom.vertices.push(new THREE.Vector3(10, 0, 10));
planeGeom.vertices.push(new THREE.Vector3(20, 0,0));
planeGeom.vertices.push(new THREE.Vector3(-10, 0, 0));
//create the 2 faces , maybe i should play with CW or CCW order... ;)
planeGeom.faces.push(new THREE.Face3(0,1,3));
planeGeom.faces.push(new THREE.Face3(1,2,3));
//Compute widths ratio
var topWidth = Math.abs(Plane.TR.x - Plane.TL.x);
var bottomWidth = Math.abs(Plane.BR.x - Plane.BL.x);
var ratio = topWidth / bottomWidth;
//create UV's as barely explained in the link above (www.xyzw.us)
var UVS = …Run Code Online (Sandbox Code Playgroud) 我有一个使用四个纹理的OBJ。文件中定义的UV的范围是(0,0)到(2,2),这样(0.5,0.5)表示第一纹理中的坐标,(0.5,1.5)是第二纹理中的UV坐标, (1.5,0.5)是第三个纹理中的坐标,而(1.5,1.5)是最后一个纹理中的坐标。
我已经有了正确的three.js几何图形或对象。但是,我现在需要能够将正确的纹理贴图应用于这些对象。
在代码中:
我有一个THREE.Mesh正确的几何图形(UV坐标为U = [0,2],V = [0,2])和虚拟占位符材料。我目前加载单个纹理,如下所示:
var texture = new THREE.TextureLoader().load('tex_u1_v1.png', function() {
object.material.map = texture;
object.material.map.needsUpdate = true;
});
Run Code Online (Sandbox Code Playgroud)
如预期的那样,四分之一的网格已正确纹理化。我有三个比较有质感文件tex_u1_v2.png,tex_u2_v1.png和tex_u2_v2.png。我希望能够将这些纹理也应用到object(THREE.js网格),这样网格中的每个有效UV都有一个纹理。
但是,我不知道object在创建之后如何向其中添加多种材料。而且,我不知道如何指定网格tex_u1_v2.png,例如,应将其用于范围为(U = [0,2],V = [1,2])的UV。
我正在为GWEN(无多余废话的GUI)编写Vulkan渲染器,但在获取纹理坐标以匹配时遇到问题。
中间显示的纹理是我们用于GUI的图像,我确保将其渲染到四边形以确保正确加载。
GUI的结构似乎是正确的,这使我相信UV坐标不正确。特别是Y坐标,因为据我所知X看起来还可以。
void Vulkan::AddVert(int x, int y, float u, float v)
{
vertices.emplace_back();
vertices.back().pos.x = ((float)x / 400) - 1.f;
vertices.back().pos.y = ((float)y / 300) - 1.f;
// Our image is 512x512 px
vertices.back().texCoord.x = (u / 512.0f);
vertices.back().texCoord.y = 1.0f - (v / 512.0f);
}
void Vulkan::DrawTexturedRect(Gwen::Texture* pTexture, Gwen::Rect rect, float u1, float v1, float u2, float v2)
{
// ToDo: Implement textures through GWEN
// The GUI texture is hardcoded for now
// …Run Code Online (Sandbox Code Playgroud) 我正在为 OpenGL ES 2.0 在 objc 中编写我自己的 .obj 解析器,以便更好地了解 OpenGLES 的工作原理。加载顶点并显示带有顶点颜色的模型就像一个魅力。只是一个小提示:我正在使用索引缓冲区。
真正的问题是纹理 atm 的映射。正如您将在下面看到的更多内容一样,我的纹理没有按照应有的方式进行映射。
这是我认为 .obj 格式的工作原理,如果我错了,请纠正我:“f”线描述了一个面,其中斜线前的数字定义了顶点的索引,斜线后的数字定义了纹理坐标.
考虑以下 .obj 文件(由 Cinema 4D 导出):
v -75 75 -50
v 75 75 -50
v -75 -75 -50
v 75 -75 -50
vt 0 0
vt 0 1
vt 1 1
vt 1 0
f 4/3 3/2 1/1
f 2/4 4/3 1/1
Run Code Online (Sandbox Code Playgroud)
以及以下纹理:

现在,当我在 OpenGL ES 3D 空间中定位顶点并尝试将纹理坐标映射到每个单独的顶点时,映射出错了。我可以通过移动一些纹理坐标值来解决这个问题,但我意识到这不是这样做的方法。我还尝试编辑我的一些 .obj 导出器设置以翻转轴和/或 uv 映射,但没有一个会导致正确的映射。关于 .obj 文件格式,我的理论中是否缺少某些内容?我可能已经说过的一件事是:我昨天读到 .obj 格式的坐标系将 topleft 定义为纹理的锚点。所以我已经在解析中解决了这个问题。
这是当前情况的一个小总结: 更新:纹理的坐标系是实际的 .obj 纹理坐标系,而不是 OpenGL …
我想在挤压几何体的表面使用纹理。我研究自定义 UV 生成器已经有一段时间了,并发现了这些相关问题: 1.)如何将纹理应用到 THREE.ExtrudeGeometry? 2.)加载的纹理显得模糊,或者像单一颜色。如何让纹理变得酥脆锐利
但是,建议将我的几何点除以 1000 的方法不起作用,mesh.scale.set(1000,1000,1)因为我的几何不再位于正确的位置。我更愿意指定 UV 映射。一个答案说要根据源代码实现一个自定义 uvgenerator,但我被困住了并且不知道该怎么做。
这是我的几何体创建,材质为 512x512px,如何将纹理映射到顶部?:
pointList=[[0,0,0],
[0,1000,0],
[750,1000,0],
[750,750,0],
[1000,750,0],
[1000,0,0]]
for (i=0;i < pointList.length; i++) {
point = pointList[i];
x = point[0];
y = point[1];
myPoints.push( new THREE.Vector2 (x,y) );
}
myShape = new THREE.Shape( myPoints );
extrusionSettings = {
amount:height
};
myGeometry = new THREE.ExtrudeGeometry( myShape, extrusionSettings );
resultshape = new THREE.Mesh( myGeometry, material );
Run Code Online (Sandbox Code Playgroud)