球体的顶点绘制与纹理坐标的转换

2023-10-21 10:30

本文主要是介绍球体的顶点绘制与纹理坐标的转换,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

预备知识:基础三角函数sin 、cos、方位角、仰角

方位角:the angular distance usually measured clockwise from the north point of the horizon to the intersection with the horizon of the vertical circle passing through a celestial body — from WiseDictionary
意思就是说水平圆片的角 θ \theta θ 范围 是 从0~2π
仰角:在视线所在的垂直平面内,水平线以上的视线与水平线所形成的夹角 ϕ \phi ϕ

在这里插入图片描述
在该图片中,x轴指向屏幕外,与y轴垂直,Z轴指向上方。且线段|PO| = R

即:R* cos( ϕ \phi ϕ) = z;
R* sin( ϕ \phi ϕ) = |OP1| (注P1为点P在圆形平面xoy 上的垂点)
沿着P1作线段 垂直x轴于P2,

 线段|P1P2|就是y, |OP2|就是x
|p1p2| = y
|Op2| = x

对于球上一点P(x,y,z),;

P ( x , y , z ) = { R ∗ s i n ( t h e t a ) ∗ c o s ( p h i ) , R ∗ s i n ( t h e t a ) ∗ s i n ( p h i ) , R ∗ c o s ( t h e t a ) P(x,y,z) = \begin{cases} R*sin(theta)*cos(phi), \\ R*sin(theta)*sin(phi), \\ R*cos(theta) \end{cases} P(x,y,z)=Rsin(theta)cos(phi),Rsin(theta)sin(phi),Rcos(theta)

最后需要注意点:在一般的生活中,x轴指向屏幕外,与y轴垂直,Z轴指向上方,这并不奇怪。但在图形学中,通常是Z轴指向屏幕里面,我们看到的2D平面(屏幕)是横轴X向右为正,纵轴Y向下为正。

球体3D坐标轴与2D纹理顶点数据

在上述公式中决定P(x, y, z)的只有R(默认为1.0f)和 θ \theta θ角以及 ϕ \phi ϕ
绘制一个球体的过程在代码中总是从下到上,一层一层地绘制出“点圈”,数层点圈紧密叠在一起就成了一个球体。我们将抽象成两个变量:1、一个y轴上线性递增的量ySegment 2、一个围绕不同维度画一个圈的周长长度的变量xSegment。

如果我们想要将一张2D的图片映射到3D的球面上,那么就必须保持2D图片坐标(U, V)与(xSegment, ySegment)对应即可。

也就是说当设定好xSegment和ySegment的增长率,这里假设为a,b;
那么就可以有:
U = xSegment = xstep * a ; (比如,a = 1/50,将周长均匀划分50等分 )
V = ySegment = ystep * b; (比如, b = 1/50,将球的高度均匀划分50等分)

附带C++实现球体3D坐标到2D纹理坐标的代码:

	const float R = 1.0f;for (int y = 0; y <= Y_SEGMENTS; y++){for (int x = 0; x <= X_SEGMENTS; x++){float xSegment = (float)x / (float)X_SEGMENTS;float ySegment = (float)y / (float)Y_SEGMENTS;float xPos = std::cos(xSegment * 2.0f * PI) * std::sin(ySegment * PI);float yPos = std::cos(ySegment * PI);float zPos = std::sin(xSegment * 2.0f * PI) * std::sin(ySegment * PI);sphereVertices.push_back(xPos);sphereVertices.push_back(yPos);sphereVertices.push_back(zPos);// xSegment. ySegment就是对应的纹理坐标纹理//同样压入顶点序列sphereVertices.push_back(xSegment);sphereVertices.push_back(ySegment);}}

这篇关于球体的顶点绘制与纹理坐标的转换的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/253791

相关文章

使用Python绘制蛇年春节祝福艺术图

《使用Python绘制蛇年春节祝福艺术图》:本文主要介绍如何使用Python的Matplotlib库绘制一幅富有创意的“蛇年有福”艺术图,这幅图结合了数字,蛇形,花朵等装饰,需要的可以参考下... 目录1. 绘图的基本概念2. 准备工作3. 实现代码解析3.1 设置绘图画布3.2 绘制数字“2025”3.3

JAVA中整型数组、字符串数组、整型数和字符串 的创建与转换的方法

《JAVA中整型数组、字符串数组、整型数和字符串的创建与转换的方法》本文介绍了Java中字符串、字符数组和整型数组的创建方法,以及它们之间的转换方法,还详细讲解了字符串中的一些常用方法,如index... 目录一、字符串、字符数组和整型数组的创建1、字符串的创建方法1.1 通过引用字符数组来创建字符串1.2

使用Python绘制可爱的招财猫

《使用Python绘制可爱的招财猫》招财猫,也被称为“幸运猫”,是一种象征财富和好运的吉祥物,经常出现在亚洲文化的商店、餐厅和家庭中,今天,我将带你用Python和matplotlib库从零开始绘制一... 目录1. 为什么选择用 python 绘制?2. 绘图的基本概念3. 实现代码解析3.1 设置绘图画

Python绘制土地利用和土地覆盖类型图示例详解

《Python绘制土地利用和土地覆盖类型图示例详解》本文介绍了如何使用Python绘制土地利用和土地覆盖类型图,并提供了详细的代码示例,通过安装所需的库,准备地理数据,使用geopandas和matp... 目录一、所需库的安装二、数据准备三、绘制土地利用和土地覆盖类型图四、代码解释五、其他可视化形式1.

如何用Python绘制简易动态圣诞树

《如何用Python绘制简易动态圣诞树》这篇文章主要给大家介绍了关于如何用Python绘制简易动态圣诞树,文中讲解了如何通过编写代码来实现特定的效果,包括代码的编写技巧和效果的展示,需要的朋友可以参考... 目录代码:效果:总结 代码:import randomimport timefrom math

Java将时间戳转换为Date对象的方法小结

《Java将时间戳转换为Date对象的方法小结》在Java编程中,处理日期和时间是一个常见需求,特别是在处理网络通信或者数据库操作时,本文主要为大家整理了Java中将时间戳转换为Date对象的方法... 目录1. 理解时间戳2. Date 类的构造函数3. 转换示例4. 处理可能的异常5. 考虑时区问题6.

基于C#实现将图片转换为PDF文档

《基于C#实现将图片转换为PDF文档》将图片(JPG、PNG)转换为PDF文件可以帮助我们更好地保存和分享图片,所以本文将介绍如何使用C#将JPG/PNG图片转换为PDF文档,需要的可以参考下... 目录介绍C# 将单张图片转换为PDF文档C# 将多张图片转换到一个PDF文档介绍将图片(JPG、PNG)转

【WebGPU Unleashed】1.1 绘制三角形

一部2024新的WebGPU教程,作者Shi Yan。内容很好,翻译过来与大家共享,内容上会有改动,加上自己的理解。更多精彩内容尽在 dt.sim3d.cn ,关注公众号【sky的数孪技术】,技术交流、源码下载请添加微信号:digital_twin123 在 3D 渲染领域,三角形是最基本的绘制元素。在这里,我们将学习如何绘制单个三角形。接下来我们将制作一个简单的着色器来定义三角形内的像素

Flutter 进阶:绘制加载动画

绘制加载动画:由小圆组成的大圆 1. 定义 LoadingScreen 类2. 实现 _LoadingScreenState 类3. 定义 LoadingPainter 类4. 总结 实现加载动画 我们需要定义两个类:LoadingScreen 和 LoadingPainter。LoadingScreen 负责控制动画的状态,而 LoadingPainter 则负责绘制动画。

POJ3041 最小顶点覆盖

N*N的矩阵,有些格子有物体,每次消除一行或一列,最少要几次消灭完。 行i - >列j 连边,表示(i,j)处有物体,即 边表示 物体。 import java.io.BufferedReader;import java.io.InputStream;import java.io.InputStreamReader;import java.io.PrintWriter;impo