使用WbbGPU制作爱心

简介: 7月更文挑战第9天

心形的坐标公式有很多,因为心形弧度不同其坐标公式也不同。
在本示例中,我们依然假定每个顶点坐标的 z 坐标永远为 0,我们需要计算的是 x, y 坐标,因此你可以把它当成一个 二维的直角坐标系 来看。

在本示例中,我们基于以下这个心形坐标公式:
x = a(3sin(θ) - sin(3θ))
y = 2a(2
cos(θ) - cos(2θ))

心形坐标函数最著名的莫过于 笛卡尔 爱情故事中的 r=a(1-sinθ),在这个公式中 r 表示极坐标中 点与圆形的距离,θ 为点与 x 轴的夹角,a 为一个系数。
电视剧《隐秘的角落》中提及过这个公式。

直角坐标系,创始人是 笛卡尔,直角坐标系也被称为 笛卡尔坐标系。
极坐标 的创始人是牛顿。

直角坐标系中是通过 x, y 坐标值来定位一个 点 的位置。
极坐标则是通过 r, θ 来定位一个点的位置
上面提到的 极坐标 默认是指 二维的,在 3D 球形中使用的是 3 维极坐标,通常称呼为 “球极坐标”。
用户可调节的系数
使用了 TypeScript,所以先定义那些用户可以控制调节的各项系数。
interface GuiData {
offsetRadian: number
xRatio: number
yRatio: number
xMultiple: number
yMultiple: number
points: number
r: number
g: number
b: number
offsetX: number
offsetY: number
}

// 各项系数默认值,这些值可以绘制出一个比较正的心形图案
let guiDataInit: GuiData = {
offsetRadian: 4,
xRatio: 0.1,
yRatio: 0.24,
xMultiple: 3,
yMultiple: 2,
points: 48,
r: 1,
g: 0,
b: 0,
offsetX: 0,
offsetY: 0.1
}1. offsetRadian:用来控制每一次绘制点时的角度偏移量

  1. xRatio、yRatio:x,y 中 a 的系数值
  2. xMultiple、yMultiple:x,y 括号中的系数值
  3. points:设定顶点的总数,我们假定它一定是大于或等于 4 ,且一定是 2 的整倍数
  4. r,g,b:一个 RGB 颜色值的 3 个分量
  5. offsetX、offsetY:x,y 整体的偏移量

生成顶点坐标的 JS 函数:
const getHeartXYArr = (data: GuiData) => {

const { offsetRadian, xRatio, yRatio, xMultiple, yMultiple, points, offsetX, offsetY } = data

const radian = Math.PI * 2 / points

const res: number[] = []
let rad: number = 0
for (let i = 0; i < points; i++) {
    rad = (radian + Math.PI / offsetRadian) * i
    res.push(xRatio * (xMultiple * Math.sin(rad) - Math.sin(xMultiple * rad)) + offsetX)
    res.push(yRatio * (yMultiple * Math.cos(rad) - Math.cos(yMultiple * rad)) + offsetY)
}
res.push(res[0], res[1])

return res

}请注意上述代码中,我们在获得了各个关键的顶点坐标信息后,在数组的结尾处重新添加了一次第一个顶点坐标,这样做的目的是为了让线段绘制可以 “首尾相连”,即 最后一个坐标点连接到最开始的坐标点上。

配置管线中关于顶点的拓扑关系
在之前绘制一个三角形的示例中,此处的配置为:
primitive: {
topology: 'triangle-strip'
}'triangle-strip' 表示:三个点组成一个实心的三角形

而在本示例中,我们此处的配置修改为:
primitive: {
topology: 'line-strip'
}'line-strip' 表示:点与点之间依次连接,形成线段

关于 react-dat-gui 的介绍
我平时主要使用 React,GUI 控件有很多,而我一直习惯使用 ​​react-dat-gui​​。
yarn add react-dat-gui
Three.js 官方示例中很多使用的是 mrdoob 编写的 ​​dat.gui​​
当然也有使用 ​​lil-gui​​ 这个的。

相关实践学习
部署Stable Diffusion玩转AI绘画(GPU云服务器)
本实验通过在ECS上从零开始部署Stable Diffusion来进行AI绘画创作,开启AIGC盲盒。
相关文章
|
23天前
|
XML 前端开发 JavaScript
如何制作一个自己的网站?
在今天的互联网时代,网站展示已经是一个很基础的营销工具。不管是企业、还是个人,如何制作一个自己的网站?本文将会提供一个全面的基础制作网页教程,教你如何从零开始制作网页。
|
6月前
|
安全 Android开发 数据安全/隐私保护
制作系统签名
五月打卡
54 0
|
前端开发 JavaScript 编译器
聊聊制作网站那些事!
聊聊制作网站那些事!
77 0
|
11月前
水晶头制作
水晶头制作。
162 44
|
iOS开发
如何制作游戏微端
如何制作游戏微端
115 0
|
容器
如何在微信小游戏制作工具中快速的制作一个血条?
如图,添加了两个血条的图片,一个当作背景,一个当作前景,并且把这两个图片放到了一个“血条1”容器中,另外增加了一个“打你丫的”按钮,用来模拟攻击,点击“打你丫的”按钮,血条就会掉血。
177 0
|
数据可视化 开发工具 Android开发
个人尝试制作游戏最好的选择是什么?
有不少人都想尝试着做游戏,不论是尝试着实现自己曾经的游戏梦想也好,还是试着把做游戏当做一个副业也好,对于所有的想要或者正在做游戏的个人来讲,从微信小游戏开始都是一个最好的选择。 我自己现在正在做微信小游戏,而且也在教很多的学员做微信小游戏。你可能会觉得我这样说是有一定的动机的,但其实不然,如果我自己不相信这个平台的话,那其实我是没有必要自己做的,只需要忽悠让别人相信就可以了。但是现在我自己也正在致力于做这件事,这也证明了我对它的认可。不是有这么一句话吗?不要轻易相信一个人说了什么,而要看他做了什么。
144 0
|
数据可视化 程序员 开发者
零基础如何自己制作游戏?
首先我们来看一下这个问题本身,能问出这个问题的基本上就是新手,小白,零基础,对于游戏开发这个领域没有任何的了解的人。为什么这么说呢?因为只有当你对于一个领域没有任何了解的时候,才会问出这么宽泛的问题。 所以你看,但凡问那种很宽泛的问题的,基本上都是对于这个领域没有任何了解的,也就是新手小白。但是新手小白也没有什么可丢人的,毕竟谁在接触一个新领域的时候不是新手小白呢?
337 0
|
搜索推荐 开发工具 Android开发
更“大”的微信小游戏制作工具
为什么这么久都不开发新功能了呢?因为人手和资源有限。这个可能跟很多人想的不一样,这个不是微信的产品吗?腾讯公司会没人没资源?大公司的实际情况可能还真跟很多人想的不一样。微信小游戏制作工具背后的团队不大,甚至比你想要的还要小,而且团队除了需要负责这个工具的维护之外,还有很多其它的事情需要处理。
270 0