当前位置: 首页 > 科技观察

怎样用Three.js 画一个NFT “蘑菇”_0

时间:2023-03-21 17:39:20 科技观察

如何用Three.js(Non-FungibleToken,非同质代币)画一个NFT“蘑菇”,以及如何在区块链上做产品。蘑菇的设计将使用JavaScript和Three.js。本文将介绍如何在虚拟世界中生成和发布艺术品。背景出于兴趣,我经常写一些奇怪的文章。过年的时候,关于NFT的消息一度让我震惊,所以我也想尝试在这个模式下玩一些有创意的东西。之前我不认为将JPEG上传到区块链有什么大不了的,但是能够将艺术品放在区块链上的可能性令人兴奋。简而言之,这背后的想法是制作一些代币生成器,每次你“铸造”一个代币时,它都会给你一件独特的艺术品(实际上,区块链中的一个调用方法,你们双方都需要钱来执行它,艺术家也需要得到一定的报酬)。显然,您可能会有一种奇怪的感觉,即此交易生成了一些独特的东西并永久存储在区块链中。一些艺术平台已经利用了这个想法,最著名的是artblocks.io。它建立在以太坊区块链的基础上,仍然使用工作量证明模型并且Gas(手续费)非常高。所以,我决定尝试一个更自主、更便宜、更环保的平台——fxhash.xyz。什么是生成式NFT艺术品?所有生成的NFT艺术品(NFT,全称Non-FungibleToken,指的是非同质化的代币,包括jpg和视频剪辑,是唯一用于代表数字资产的加密代币。卡片,可以买卖。)基本上,它们以网页形式呈现,并使用vanillaJavaScript或某些第三方库在画布上绘制。NFT艺术品可分为三类:抽象数学艺术品、有形程序艺术品和可变手绘艺术品。如图1所示。第一类,抽象数学艺术品,利用一些数学概念生成抽象图像,其中可能有一些分形(复杂的几何形状),吸引子(一个系统趋向于向某种稳定状态发展,这种稳定状态称为吸引子)、元胞自动机(cellularautomata,是一种以离散时间、空间和状态、空间相互作用和时间因果关系为局部的网格动力学模型,能够模拟复杂系统过程能力的时空演化。)等。第二类,有形的程序艺术品,试图以参数化的方式描述一些具体的事物。第三类,可变手绘图稿,是图像预绘部分的简单随机化。图1此外,还有一些实验性、交互性的作品,甚至是模块化合成器、游戏等艺术作品,虽然比较少见。本文将描述蘑菇艺术品的创作过程,并使用交易哈希将其随机化。凭借一些艺术视野、构图和风格化,我们最终得到了这个“生成性NFT艺术品”。2.绘制蘑菇Otiniumcaseubbacula——生成蘑菇作品之一介绍完理论知识,我们进入技术环节。本项目完全使用Three.js库,它有一个易于使用的JavaScript库,其API用法很容易在网络上找到。1.生成柄首先绘制柄的样条(我们称之为基本样条,样条的作用是辅助生成实体),然后对样条进行参数化,形成柄的轮廓。为了创建基本样条曲线,我使用了Three.js中的CatmullRomCurve3类。然后,通过沿着基本样条线移动,创建闭合形状以构建相应的几何图形,最后将这些图形连接起来,如图2所示。Three.js中的BufferGeometry组件用于此操作。代码如下:stipe_vSegments=30;//垂直分辨率stipe_rSegments=20;//角度分辨率stipe_points=[];//verticesstipe_indices=[];//面对指数stipe_shape=newTHREE.CatmullRomCurve3(...,closed=false);functionstipe_radius(a,t){...}for(vart=0;t<1;t+=1/stipe_vSegments){//柄轮廓曲线varcurve=newTHREE.CatmullRomCurve3([newTHREE.Vector3(0,0,stipe_radius(0,t)),newTHREE.Vector3(stipe_radius(Math.PI/2,t),0,0),newTHREE.Vector3(0,0,-stipe_radius(Math.PI,t)),newTHREE.Vector3(-stipe_radius(Math.PI*1.5,t),0,0),],closed=true,curveType='catmullrom',tension=0.75);varprofile_points=curve.getPoints(stipe_rSegments);对于(vari=0;it添加径向噪声vart=t0*(1+radnoise(a,t0));//计算t中的法向量varshape_point=cap_shape.getPointAt(t);vartangent=cap_shape.getTangentAt(t);varnorm=newTHREE.Vector3(0,0,0);constz1=newTHREE.Vector3(0,0,1);norm.crossVectors(z1,切线);//a0->a通过添加角度噪声vara=angnoise(a0,t);varsurface_point=newTHREE.Vector3(Math.cos(a)*shape_point.x,shape_point.y,Math.sin(a)*shape_point.x);//正常噪声系数varsurfnoise_val=normnoise(a,t);//最终表面点surface_point.x+=norm.x*Math.cos(a)*surfnoise_val;冲浪ace_point.y+=norm.y*surfnoise_val;surface_point.z+=norm.x*Math.sin(a)*surfnoise_val;返回表面点;noisecomponentsfromlefttoright:radial,angle,normalFigure5如图5所示,从左到右分别给出了cap直径内的noise,anglenoise和normalnoise。蘑菇的其余部分:鳞片、鳃、环鳃和环的几何形状与菌盖非常相似。可以在帽表面上的一些随机锚点周围生成噪声顶点,然后基于它们创建一个ConvexGeometry。代码如下:bufgeoms=[];scales_num=20;n_vertices=10;scale_radius=2;for(vari=0;i0&&collisionResults[0].distance