通过Gemini实现AI自动化学习和编写3D图形代码 - aardio
By
admin
at 10 天前 • 0人收藏 • 78人看过

本文引用自: [图像] 绘制3D立方体-技术交流-aardio资源网
通过Gemini AI自动化实现各种3D图形的生成 , 下面是我针对AI的操作步骤:
首先: 我把3D球体和正方体的代码分别保存为两份txt文件, 然后上传到AI里面去.
然后编写提示词:
你是aardio编程高手,上面是两个用plus绘制的3D球体和正方体代码,你研究后帮我编写一个绘制3d锥体的代码
然后AI帮我编写了代码, 运行完全无错!!
不得不说AI现在是真的强











import win.ui;
import gdip;
/*DSG{{*/
var winform = win.form(text="绘制3D花朵 (数学曲面) - 鼠标拖拽旋转";right=759;bottom=469)
winform.add(
plus={cls="plus";left=0;top=0;right=760;bottom=470;db=1;dl=1;dr=1;dt=1;notify=1;z=1}
);
/*}}*/
// ==========================================
// 1. 生成花朵几何数据
// ==========================================
var vertices = {};
var faces = {};
var faceColors = {};
// 参数设置
var petals = 5; // 花瓣数量
var latBands = 20; // 纬度切分(上下精度)
var lonBands = 40; // 经度切分(圆周精度,越高花瓣越圆滑)
// --- 辅助函数:HSV转ARGB (用于生成漂亮的渐变色) ---
var hsv2argb = function(h, s, v){
var r, g, b;
var i = ..math.floor(h * 6);
var f = h * 6 - i;
var p = v * (1 - s);
var q = v * (1 - f * s);
var t = v * (1 - (1 - f) * s);
if(i%6 == 0){ r=v; g=t; b=p; }
elseif(i%6 == 1){ r=q; g=v; b=p; }
elseif(i%6 == 2){ r=p; g=v; b=t; }
elseif(i%6 == 3){ r=p; g=q; b=v; }
elseif(i%6 == 4){ r=t; g=p; b=v; }
elseif(i%6 == 5){ r=v; g=p; b=q; }
return 0xFF000000 | (r * 255) << 16 | (g * 255) << 8 | (b * 255);
}
// --- 生成顶点 ---
for(lat=0; latBands; 1){
var theta = lat * ..math.pi / latBands; // 0 到 PI
var sinTheta = ..math.sin(theta);
var cosTheta = ..math.cos(theta);
for(lon=0; lonBands; 1){
var phi = lon * 2 * ..math.pi / lonBands; // 0 到 2PI
var sinPhi = ..math.sin(phi);
var cosPhi = ..math.cos(phi);
// ==== 花朵形状核心公式 ====
// 基础球体半径 + 花瓣波动
// sin(petals * phi): 在圆周上产生波浪
// sin(theta): 让花瓣在赤道处最大,两极处收敛
var r = 1.5 + 1.2 * ..math.sin(petals * phi) * sinTheta;
// 转换为笛卡尔坐标
var x = r * cosPhi * sinTheta;
var y = r * cosTheta; // 高度轴
var z = r * sinPhi * sinTheta;
// 存储顶点,同时存储该顶点的半径r用于计算颜色
..table.push(vertices, {x=x; y=y; z=z; r=r});
}
}
// --- 生成面与颜色 ---
for(lat=0; latBands-1; 1){
for(lon=0; lonBands-1; 1){
// 计算索引
var first = (lat * (lonBands + 1)) + lon + 1; // 注意:这里简化处理,假设每层点数一致
// 由于上面的循环结构,我们需要处理 table 索引
// 修正索引逻辑:
var p1 = lat * lonBands + lon + 1;
var p2 = p1 + lonBands;
var p3 = p2 + 1;
var p4 = p1 + 1;
// 处理圆周缝隙(最后一列连回第一列)
if(lon == lonBands - 1){
p3 = p3 - lonBands;
p4 = p4 - lonBands;
}
..table.push(faces, {p1, p2, p3, p4});
// ==== 动态着色 ====
// 获取这几个点的平均半径,半径越大说明是花瓣边缘,半径越小说明是花蕊
var avgR = (vertices[p1].r + vertices[p2].r + vertices[p3].r + vertices[p4].r) / 4;
// 颜色映射逻辑:
// r 最小(约0.3) -> 黄色 (花蕊)
// r 最大(约2.7) -> 粉红/洋红 (花瓣尖端)
var color;
if(avgR < 1.6){
// 内部:黄色/橙色
color = 0xFFFFD700; // Gold
}
else {
// 外部:根据半径渐变到粉色
// 使用HSV生成平滑的粉色系
var factor = (avgR - 1.6) / 1.2; // 0.0 ~ 1.0
// Hue: 0.9(红) -> 0.8(紫红), Sat: 0.5->0.8
color = hsv2argb(0.95 - factor*0.1, 0.4 + factor*0.4, 1.0);
}
..table.push(faceColors, color);
}
}
// ==========================================
// 2. 交互状态
// ==========================================
var objState = {
angleX = 1.8; // 初始视角,稍微俯视
angleY = 0.5;
scale = 60;
offsetX = 380;
offsetY = 250;
}
// 旋转矩阵
var rotate = function(v, ax, ay) {
var x, y, z = v.x, v.y, v.z;
// X轴旋转
var y1 = y * ..math.cos(ax) - z * ..math.sin(ax);
var z1 = y * ..math.sin(ax) + z * ..math.cos(ax);
// Y轴旋转
var x2 = x * ..math.cos(ay) + z1 * ..math.sin(ay);
var z2 = -x * ..math.sin(ay) + z1 * ..math.cos(ay);
return x2, y1, z2;
}
// ==========================================
// 3. 绘图渲染
// ==========================================
winform.plus.onDrawForegroundEnd = function(graphics, rc){
// 背景
var rgbForm = ::GetSysColor(0x4/*_COLOR_MENU*/);
var argbForm = ( (rgbForm & 0xFF) << 16 ) | (rgbForm & 0xFF00) | (rgbForm>> 16 & 0xFF) | 0xFF000000;
graphics.clear(argbForm);
graphics.smoothingMode = 4/*_SmoothingModeAntiAlias*/;
// 1. 顶点变换
var transformedV = {};
for(i=1; #vertices){
var rx, ry, rz = rotate(vertices[i], objState.angleX, objState.angleY);
transformedV[i] = {
x = rx * objState.scale + objState.offsetX;
y = ry * objState.scale + objState.offsetY;
z = rz;
};
}
// 2. 面排序 (Z-Sort)
var drawList = {};
for(i=1; #faces){
var f = faces[i];
var t1,t2,t3,t4 = transformedV[f[1]], transformedV[f[2]], transformedV[f[3]], transformedV[f[4]];
// 计算中心Z深度
var avgZ = (t1.z + t2.z + t3.z + t4.z) * 0.25;
..table.push(drawList, {
z = avgZ;
points = {t1.x, t1.y, t2.x, t2.y, t3.x, t3.y, t4.x, t4.y};
color = faceColors[i];
});
}
// 排序:远处的先画
..table.sort(drawList, function(b){ return owner.z < b.z });
// 3. 绘制
var pen = gdip.pen(0x20000000, 1); // 极淡的边框,让花瓣看起来更柔和
for(i=1; #drawList){
var item = drawList[i];
var brush = ..gdip.solidBrush(item.color);
graphics.fillPolygon(brush, item.points);
graphics.drawPolygon(pen, item.points);
brush.delete();
}
pen.delete();
// UI
var fontFamily = gdip.family("Segoe UI Emoji");
var font = fontFamily.createFont(12);
graphics.drawString("
1 个回复 | 最后更新于 10 天前
登录后方可回帖
哇酷