You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:如何将Processing中类单叶双曲面的2D绘图转为3D效果

让你的单叶双曲面呈现真实3D效果的解决方案

嘿,我明白你现在的困扰——明明用了P3D渲染和PeasyCam,但画出来的线条还是像2D的。问题出在你当前的代码里,所有线条都只用到了X/Y平面坐标,完全没利用Z轴!单叶双曲面本身是直纹面(由两组交叉的直线构成),我们可以直接用它的参数方程来生成带Z轴深度的线条,不需要依赖立方体这类固定几何体。

核心问题分析

你当前的x1()/y1()/x2()/y2()函数只计算了平面坐标,所有线条都处于同一个Z平面上,所以旋转相机也看不到深度。要实现3D效果,必须给每个点赋予不同的Z值,让线条分布在三维空间里。

修改后的完整代码

下面是基于单叶双曲面直纹面特性改写的代码,保留了你的PeasyCam交互,还加入了动画效果:

import peasy.*;

static final int LINE_COUNT = 100; // 每组直线的数量
static final float A = 150; // 曲面X轴方向的缩放
static final float B = 150; // 曲面Y轴方向的缩放
static final float C = 100; // 曲面Z轴方向的缩放
static final float V_RANGE = 2; // 直线延伸的范围

PeasyCam cam;
float t; // 动画时间变量

void setup() {
  size(800, 600, P3D);
  background(20);
  cam = new PeasyCam(this, 800); // 调整相机初始距离
  cam.setMinimumDistance(300); // 限制相机最小距离,避免太近看不到全貌
}

void draw() {
  background(0);
  stroke(255);
  strokeWeight(1);
  
  pushMatrix();
  translate(width/2, height/2, 0); // 移到画布中心
  drawHyperboloidLines();
  popMatrix();
  
  t += 0.02; // 控制动画速度
}

void drawHyperboloidLines() {
  // 绘制第一组直纹线:固定u,遍历v
  for (int i = 0; i < LINE_COUNT; i++) {
    float u = map(i, 0, LINE_COUNT, 0, TWO_PI) + t; // 加入t实现旋转动画
    float vStart = -V_RANGE;
    float vEnd = V_RANGE;
    
    // 计算直线起点坐标
    float x1 = A * cos(u) + vStart * sin(u);
    float y1 = B * sin(u) - vStart * cos(u);
    float z1 = C * vStart;
    
    // 计算直线终点坐标
    float x2 = A * cos(u) + vEnd * sin(u);
    float y2 = B * sin(u) - vEnd * cos(u);
    float z2 = C * vEnd;
    
    line(x1, y1, z1, x2, y2, z2);
  }
  
  // 绘制第二组直纹线:固定v,遍历u(可选,让曲面更完整)
  stroke(150); // 用不同颜色区分两组线
  for (int i = 0; i < LINE_COUNT; i++) {
    float v = map(i, 0, LINE_COUNT, -V_RANGE, V_RANGE);
    float uStart = 0;
    float uEnd = TWO_PI + t;
    
    float x1 = A * cos(uStart) + v * sin(uStart);
    float y1 = B * sin(uStart) - v * cos(uStart);
    float z1 = C * v;
    
    float x2 = A * cos(uEnd) + v * sin(uEnd);
    float y2 = B * sin(uEnd) - v * cos(uEnd);
    float z2 = C * v;
    
    line(x1, y1, z1, x2, y2, z2);
  }
}

关键修改说明

  1. 引入Z轴坐标:每个线条的起点和终点都计算了Z值,让线条分布在三维空间中,旋转相机就能看到深度。
  2. 使用单叶双曲面参数方程:用u和v两个参数生成直纹线,完美贴合单叶双曲面的几何特性,不需要任何固定3D几何体。
  3. 动画效果:加入t变量控制u的偏移,让整个曲面缓慢旋转,更直观地展示3D形态。
  4. 双组线条绘制:单叶双曲面由两组交叉直线构成,同时绘制两组线能让曲面的3D结构更清晰(也可以只保留一组,看你想要的效果)。

可调参数

  • A/B/C:控制曲面在X/Y/Z三个轴上的拉伸程度,调整它们可以得到不同形态的单叶双曲面。
  • LINE_COUNT:每组线条的数量,数值越高曲面越平滑。
  • V_RANGE:直线延伸的长度,数值越大曲面“张开”得越宽。

现在运行代码,拖动鼠标旋转相机,就能看到真正带深度的3D单叶双曲面了!

内容的提问来源于stack exchange,提问作者Alberto Zavala

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 03:52:57