Как нарисовать поверхность сетки в сплошном режиме? - PullRequest
1 голос
/ 08 апреля 2019

У меня есть этот код, и я должен изменить его, чтобы сделать 2 вещи:

  1. нарисуйте поверхность в твердотельном режиме, используя базовое освещение (lights() и уникальный fill()) и
  2. Нарисуйте поверхность с двухцветным градиентом ( красный для низких значений, например z и желтый для высоких значений). Для этого я был Рекомендуется использовать fill() вызов перед каждой вершиной ()

Это мой код для первого, проблема в том, что я не хочу, чтобы сетка отображалась после применения цвета.

// Drawing a 3D function
float rotX = 0.0, rotY = 0.0;
int lastX, lastY;
float distX = 0.0, distY = 0.0;
// Function steps
int steps = 50;
// z scale
float scaleZ = 200.0;
// z zoom
float zoomZ = -300.0;
// Graphic size
float gX = 500.0, gY = 500.0;
void setup()
{
    size(500, 500, P3D);
    noFill();
    strokeWeight(0.005);
}

float function(float x, float y)
{
    return x*x*x + y*y*y;
}

void draw() {
    lights();
    background(0);

    // We center the results on window
    translate(gX/2, gY/2, zoomZ);

    // Rotation
    rotateY(rotY + distX);
    rotateX(rotX + distY);
    // Centering around (0, 0);
    translate(-gX/2, -gY/2);

    // Function covers
    // 400 x 400 x scaleZ
    scale(gX, gY, scaleZ);

    // Drawing the function
    fill(167);
    drawFunction();

    // Drawing axes
    stroke(255, 0, 0);
    line(0,0,0,2000,0,0);
    stroke(0,255,0);
    line(0,0,0,0,2000,0);
    stroke(0,0,255);
    line(0,0,0,0,0,2000);
}

void drawFunction()
{
    float x, y, z;
    int i = 0, j = 0;
    float in_steps = 1.0 / steps;

    float[][] matrix = new float[steps+1][steps+1];

    for (y = 0.0, j = 0; y <= 1.0; y+=in_steps, j++)
        for (x = 0.0, i = 0; x <= 1.0; x+=in_steps, i++)
            matrix[i][j] = function(x, y);
    stroke(167);
    for (j = 0, y = 0.0; j < steps; j++, y+=in_steps) {
        beginShape(QUAD_STRIP);
        for (i = 0, x = 0.0; i <= steps; i++, x+=in_steps) {
            vertex(x, y, matrix[i][j]);
            vertex(x, y + in_steps, matrix[i][j+1]);
        }
        endShape();
    }
}

void mousePressed()
{
    lastX = mouseX;
    lastY = mouseY;
}

void mouseDragged()
{ 
    distX = radians(mouseX - lastX);
    distY = radians(lastY - mouseY);
}

void mouseReleased()
{
    rotX += distY;
    rotY += distX;
    distX = distY = 0.0;
}

1 Ответ

0 голосов
/ 08 апреля 2019

lights() уже правильно установлены в вашем коде.

Используйте noStroke(), чтобы избавиться от линий. noStroke отключает рисование контуров.

Цвет заполненных областей можно установить, передав значения RGB (красный, зеленый и синий) в fill().
Значения являются интегральными значениями в диапазоне [0, 255]. Значение RGB для красного цвета (255, 0, 0), а значение RGB для желтого цвета (255, 255, 0).

Градиент цвета от красного до желтого можно получить с помощью

fill(255, z*255, 0);

, где z находится в [0,0, 1,0]. Если z = 0.0, то результат - красный (255, 0, 0), а если z = 1.0 - желтый (255, 255, 0). Все значения для z в диапазоне от 0,0 до 1,0 приводят к линейной интерполяции между чтением и желтым цветом.

, например

for (j = 0, y = 0.0; j < steps; j++, y+=in_steps) {
    beginShape(QUAD_STRIP);

    noStroke(); // no lines

    for (i = 0, x = 0.0; i <= steps; i++, x+=in_steps) {

        fill(255, matrix[i][j] * 255, 0); // interpolate between red and yellow
        vertex(x, y, matrix[i][j]);

        fill(255, matrix[i][j+1] * 255, 0); // interpolate between red and yellow
        vertex(x, y + in_steps, matrix[i][j+1]);
    }
    endShape();
}  

...