实现球的光照模型代码Java
时间: 2024-02-18 12:05:30 浏览: 19
以下是一个简单的球的光照模型代码示例,使用Java语言编写:
```java
import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class SphereLighting extends JPanel {
private static final long serialVersionUID = 1L;
private final int WIDTH = 640;
private final int HEIGHT = 480;
private final double LIGHT_X = 0;
private final double LIGHT_Y = 0;
private final double LIGHT_Z = 100;
private final double AMBIENT = 0.2;
private final double DIFFUSE = 0.5;
private final double SPECULAR = 0.3;
private final double SPECULAR_POWER = 32;
private final int SPHERE_RADIUS = 100;
private final int SPHERE_X = WIDTH / 2;
private final int SPHERE_Y = HEIGHT / 2;
private final Color SPHERE_COLOR = Color.WHITE;
public SphereLighting() {
JFrame frame = new JFrame("Sphere Lighting");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(WIDTH, HEIGHT);
frame.add(this);
frame.setVisible(true);
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(SPHERE_COLOR);
for (int x = -SPHERE_RADIUS; x <= SPHERE_RADIUS; x++) {
for (int y = -SPHERE_RADIUS; y <= SPHERE_RADIUS; y++) {
double z = Math.sqrt(SPHERE_RADIUS * SPHERE_RADIUS - x * x - y * y);
if (!Double.isNaN(z)) {
double[] normal = { x, y, z };
double[] light = { LIGHT_X, LIGHT_Y, LIGHT_Z };
double[] view = { 0, 0, -1 };
double[] h = { light[0] + view[0], light[1] + view[1], light[2] + view[2] };
double[] unitNormal = normalize(normal);
double[] unitLight = normalize(light);
double[] unitView = normalize(view);
double[] unitH = normalize(h);
double ambient = AMBIENT;
double diffuse = Math.max(0, dot(unitNormal, unitLight)) * DIFFUSE;
double specular = Math.pow(Math.max(0, dot(unitNormal, unitH)), SPECULAR_POWER) * SPECULAR;
double intensity = ambient + diffuse + specular;
int red = (int) (SPHERE_COLOR.getRed() * intensity);
int green = (int) (SPHERE_COLOR.getGreen() * intensity);
int blue = (int) (SPHERE_COLOR.getBlue() * intensity);
g.setColor(new Color(red, green, blue));
g.drawLine(SPHERE_X + x, SPHERE_Y + y, SPHERE_X + x, SPHERE_Y + y);
}
}
}
}
private double[] normalize(double[] v) {
double length = Math.sqrt(v[0] * v[0] + v[1] * v[1] + v[2] * v[2]);
return new double[] { v[0] / length, v[1] / length, v[2] / length };
}
private double dot(double[] a, double[] b) {
return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];
}
public static void main(String[] args) {
new SphereLighting();
}
}
```
该代码创建了一个简单的GUI窗口,其中绘制了一个白色的球体。在每个像素上进行光照计算,根据环境光、漫反射和镜面反射计算出颜色,并将该颜色用于像素。这里使用了一个简单的Phong光照模型,包括环境光、漫反射和镜面反射。