//
import java.awt.*; // TEST OF A VERY SIMPLE 3D RENDERER public class Car extends SimpleRender { public Color myBgColor = new Color(.7f,.7f,1f); //----- THE INPUT DATA FOR THE SCENE ----- // FOR EACH SHAPE, ITS R,G,B COLOR public double[][] myColors = { {.2,.2,.2}, {.2,.2,.2}, // REAR WHEELS {.2,.2,.2}, {.2,.2,.2}, // FRONT WHEELS {2,2,2}, {2,2,2}, // REAR AXLES {2,2,2}, {2,2,2}, // FRONT AXLES {1,0,0}, {1,0,0}, {1,0,0}, {1,0,0}, // BODY }; // FOR EACH SHAPE, DEFINE TRANSLATION X Y Z, ROTATION X Y Z, SCALE X Y Z public double[][][] myTransformations = { {{-2,0,-2.2}, {0,0,0}, {.5,.5,.2}}, // WHEELS {{-2,0, 2.2}, {0,0,0}, {.5,.5,.2}}, {{ 2,0,-2.2}, {0,0,0}, {.5,.5,.2}}, // WHEELS {{ 2,0, 2.2}, {0,0,0}, {.5,.5,.2}}, {{-2,0,-1.8 }, {0,0,0}, {.1,.1,.2 }}, // AXLES {{-2,0, 1.8 }, {0,0,0}, {.1,.1,.2 }}, {{ 2,0,-1.8 }, {0,0,0}, {.1,.1,.2 }}, // AXLES {{ 2,0, 1.8 }, {0,0,0}, {.1,.1,.2 }}, {{-2,0, 0 }, {0,0,0}, {1 ,.4,1.6}}, // BODY {{ 0,0, 0 }, {0,0,0}, {1 ,.4,1.6}}, {{ 2,0, 0 }, {0,0,0}, {1 ,.4,1.6}}, {{ 0,.8,0 }, {0,0,0}, {1 ,.4,1.6}}, }; final int LENGTH = 0; final int WIDTH = 1; final int HEIGHT = 2; final int RED = 3; final int GREEN = 4; final int BLUE = 5; final int HUE = 6; final int SATURATION = 7; final int VALUE = 8; String[] lineLabels = {"lines on", "lines off"}; public void initialize() { bgColor = myBgColor; colors = myColors; transformations = myTransformations; shape = new Shape[colors.length]; for (int i = 0 ; i < shape.length ; i++) { shape[i] = new Shape(); if (i < 8) shape[i].cylinder(20); } addSlider("length",0,0); addSlider("width" ,0,16); addSlider("height",0,32); addSlider("red" ,100,0); addSlider("green",100,16); addSlider("blue" ,100,32); addSlider("hue" ,200,0); addSlider("saturation",200,16); addSlider("value" ,200,32); addButton(lineLabels,300,0); slider[RED].setValue(1); slider[GREEN].setValue(0); slider[BLUE].setValue(0); adjustHSV(); super.initialize(); } public void update() { double L = 0.5 + 2.8 * slider[LENGTH].getValue(); double W = 0.4 + 2.4 * slider[WIDTH].getValue(); double H = 0.8 * slider[HEIGHT].getValue(); if (slider[RED].isDown || slider[GREEN].isDown || slider[BLUE].isDown) adjustHSV(); else if (slider[HUE].isDown || slider[SATURATION].isDown || slider[VALUE].isDown) adjustRGB(); for (int i = 8 ; i < 12 ; i++) { colors[i][0] = slider[RED].getValue(); colors[i][1] = slider[GREEN].getValue(); colors[i][2] = slider[BLUE].getValue(); } double[][][] t = transformations; t[0][0][0] = t[1][0][0] = t[4][0][0] = t[5][0][0] = t[8][0][0] = -L; t[2][0][0] = t[3][0][0] = t[6][0][0] = t[7][0][0] = t[10][0][0] = L; t[8][2][0] = t[9][2][0] = t[10][2][0] = t[11][2][0] = L/2; t[0][0][2] = t[2][0][2] = -W-.2; t[1][0][2] = t[3][0][2] = W+.2; t[4][0][2] = t[6][0][2] = -W+.2; t[5][0][2] = t[7][0][2] = W-.2; t[8][2][2] = t[9][2][2] = t[10][2][2] = t[11][2][2] = W-.4; t[11][0][1] = H+.4; t[11][2][1] = H; outline = button[0].getValue() == 1; } private void adjustHSV() { double[] rgb = {slider[RED].getValue(), slider[GREEN].getValue(), slider[BLUE].getValue()}, hsv = {0,0,0}; ColorSpace.rgb2hsv(rgb, hsv); slider[HUE].setValue(hsv[0]); slider[SATURATION].setValue(hsv[1]); slider[VALUE].setValue(hsv[2]); } private void adjustRGB() { double[] hsv = {slider[HUE].getValue(), slider[SATURATION].getValue(), slider[VALUE].getValue()}, rgb = {0,0,0}; ColorSpace.hsv2rgb(hsv, rgb); slider[RED].setValue(rgb[0]); slider[GREEN].setValue(rgb[1]); slider[BLUE].setValue(rgb[2]); } }