Making a Spheroid

#1

Hi

How can I go about creating a spheroid in Processing? I need it to be a solid color.

#2

I suppose you mean you want more control than the standard sphere() function gives you?

Doing it by hand, one would basically rotate around the y-axis creating quads that are positioned around a vertical semicircle; eg. spherical coordinates: https://en.wikipedia.org/wiki/Spherical_coordinate_system

You’d define the ‘resolution’ or detail of your sphere and then for each determine its vertices like so by stepping through theta and phi.

    float r = sin(theta)*_rad;
    float rNext = sin(thetaNext)*_rad;

    // coordinates of tile corners
    float x, y, z;

    // corner 0
    x = r*cos(phi);
    y = cos(theta)*_rad;
    z = r*sin(phi);
    v0 = new PVector(x, y, z);

    // corner 1
    x = r*cos(phiNext);
    y = cos(theta)*_rad;
    z = r*sin(phiNext);
    v1 = new PVector(x, y, z);

    // corner 2
    x = rNext*cos(phiNext);
    y = cos(thetaNext)*_rad;
    z = rNext*sin(phiNext);
    v2 = new PVector(x, y, z);

    // corner 3
    x = rNext*cos(phi);
    y = cos(thetaNext)*_rad;
    z = rNext*sin(phi);
    v3 = new PVector(x, y, z);
1 Like
#3

or use scale() plus sphere() to deform the sphere

import peasy.*;

PeasyCam cam;
ArrayList<SphereClass> list = new ArrayList();  

void setup() {
  size(1300, 900, P3D);

  cam=new PeasyCam(this, 400); 

  // init all spheres 
  SphereClass newSphere;

  newSphere=new SphereClass(23, 23, -230, 
    5, 5, 5);
  list.add(newSphere);

  newSphere=new SphereClass(273, 23, -230, 
    10, 5, 20);
  list.add(newSphere);

  newSphere=new SphereClass(3, 153, 30, 
    3, 3, 3);
  list.add(newSphere);
}

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

  // loop over all spheres 
  for (SphereClass sphere : list) { 
    // show it
    sphere.display();
  }

  // HUD
  cam.beginHUD();
  fill(255);
  text("use peasycam, click on speroids", 23, 23);
  cam.endHUD();
} 

void mousePressed() {
  // loop over all spheres 
  for (SphereClass sphere : list) {
    // select / unselect depending on mouse pos 
    sphere.selectWhenMouseOver();
  }//for
}

// ===========================================================

class SphereClass {

  PVector pos; // 3D vector
  PVector sizeSphere; // 3D vector
  PVector screenPos=new PVector(0, 0); // 2D vector  

  boolean selected=false; 

  // constr (pos and size)
  SphereClass(float x, float y, float z, 
    float w, float h, float d) {
    pos = new PVector(x, y, z); // 3D vector
    sizeSphere = new PVector(w, h, d); // 3D vector
  }// constr

  void display() {
    // draw sphere at pos (x, y, z) coordinate and store 2D screen pos

    pushMatrix();
    translate(pos.x, pos.y, pos.z);
    noStroke(); 
    // we choose the color depending on selected 
    if (selected)
      fill(255, 0, 0); // red 
    else
      fill(0, 0, 255); // blue 
    // draw the sphere
    scale(sizeSphere.x, sizeSphere.y, sizeSphere.z); 
    sphere(11);
    // we monitor the 2D screen pos throughout and store it
    screenPos.set(screenX(0, 0, 0), screenY(0, 0, 0));
    popMatrix();

    // show the 2D screen pos
    if (keyPressed)
      drawSignX(screenPos);
  }

  void drawSignX( PVector pos ) { 
    // Draw a "X" sign
    // 
    float sizeHalf=60; 
    float x=pos.x;
    float y=pos.y;
    float z=pos.z;  
    stroke(255);
    line(x-sizeHalf, y-sizeHalf, z, x+sizeHalf, y+sizeHalf, z); 
    line(x+sizeHalf, y-sizeHalf, z, x-sizeHalf, y+sizeHalf, z);
  }

  boolean selectWhenMouseOver() {
    // select / unselect

    if (mouseOver()) 
      selected=true;
    else 
    selected=false;

    return selected;
  }

  boolean mouseOver() {
    return 
      dist(mouseX, mouseY, screenPos.x, screenPos.y) < 50;
  }
  //
}//class
//
1 Like