通过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现在是真的强





screenshots.gif


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 天前
10 天前   #1

哇酷

登录后方可回帖

登 录
信息栏
本站域名

ChengXu.XYZ

投诉联系:  popdes@126.com



快速上位机开发学习,本站主要记录了学习过程中遇到的问题和解决办法及上位机代码分享

这里主要专注于学习交流和经验分享.
纯私人站,当笔记本用的,学到哪写到哪.
如果侵权,联系 Popdes@126.com

友情链接
Aardio官方
Aardio资源网


才仁机械


网站地图SiteMap

Loading...