import java.awt.*;
import java.awt.image.*;
import javax.imageio.ImageIO;
public class polygon3D{
public vector[] tempVertix;
public vector[] vertix2D;
public vector[] vertix3D;
public int[] vertixSpecular;
public vector[] vertixNormals;
public vector[] temp_vertixNormals;
public static vector[] tempVectors;
public vector normal, realNormal;
public vector centre, realCentre;
public static int[] xLow, xHigh, s_left, s_right, xChange_left, xChange_right;
public int[] xLow_transprent, xHigh_transprent;
public int height;
public int topIndex;
public boolean visible;
public Rectangle bound;
public double zMax, zMin;
public texture myTexture;
public double textureScaleX, textureScaleY;
public vector W, O, V, U, A, B, C;
public double aDotW, bDotW, cDotW;
public double scaleX = 1, scaleY = 1;
public int textureWidth, textureHeight, heightMask, widthMask, widthBits, heightBits;
public int X, Y, X1, Y1, dx, dy, textureIndex;
public int visibleCount;
public vector origin, rightEnd, bottomEnd;
public int L;
public vector view = new vector(0,0,1);
public int end = 0;
public int start = 479;
public boolean isLightMap;
public int[] Texture;
public int Z_length;
public double A_offset, B_offset, C_offset;
public boolean faceVerticalPolygon;
public int BigX, BigY, BigDx, BigDy;
public boolean gouraudShading;
public int diffuse_I;
public int ambient_I;
public int roughness;
public boolean waterSurface;
public polygon3D(vector[] vertix3D, vector origin, vector rightEnd, vector bottomEnd, texture myTexture){
L = vertix3D.length;
Z_length = vector.Z_length;
tempVectors = new vector[4];
for(int i = 0; i < tempVectors.length; i++)
if(tempVectors[i] == null)
tempVectors[i] = new vector();
this.vertix3D = vertix3D;
tempVertix = new vector[L];
for(int i = 0; i < L; i++){
tempVertix[i] = new vector();
tempVertix[i].set(vertix3D[i]);
}
centre = new vector(0,0,0);
testVisibility();
if(Math.abs(normal.y) > 0.99)
faceVerticalPolygon = true;
else
faceVerticalPolygon = false;
realNormal = new vector(0,0,0);
realNormal.set(normal);
realCentre = new vector(0,0,0);
realCentre.set(centre);
this.myTexture = myTexture;
if(myTexture == null)
return;
ambient_I = 60;
findDiffuse();
Texture = myTexture.Texture;
this.origin = origin;
this.rightEnd = rightEnd;
this.bottomEnd = bottomEnd;
textureWidth = myTexture.width;
textureHeight = myTexture.height;
heightMask = myTexture.heightMask;
widthMask = myTexture.widthMask;
widthBits = myTexture.widthBits;
heightBits = myTexture.heightBits;
findTextureScale();
W = new vector(); O = new vector(); V = new vector(); U = new vector(); A = new vector(); B = new vector(); C = new vector();
vertix2D = new vector[L+1];
for(int i = 0; i < vertix2D.length; i++)
vertix2D[i] = new vector(0,0,0);
vertixSpecular = new int[L+1];
temp_vertixNormals = new vector[L+1];
for(int i = 0; i < L+1; i++)
temp_vertixNormals[i] = new vector(0,0,0);
vertixNormals = new vector[L];
for(int i = 0; i < L; i++)
vertixNormals[i] = new vector(0,0,0);
if(xLow == null){
xLow = new int[480];
xHigh = new int[480];
s_left= new int[480];
s_right = new int[480];
xChange_left = new int[480];
xChange_right = new int[480];
}
}
public final void findTextureScale(){
tempVectors[0].set(origin);
tempVectors[0].subtract(rightEnd);
double l = tempVectors[0].getLength();
textureScaleX = l/myTexture.width;
tempVectors[0].set(origin);
tempVectors[0].subtract(bottomEnd);
l = tempVectors[0].getLength();
textureScaleY = l/myTexture.height;
}
public static polygon3D createPolygon(vector[] vertix3D, vector origin, vector rightEnd, vector bottomEnd, texture myTexture, double textureX, double textureY, double scaleX, double scaleY){
vector x = origin.myClone();
x.subtract(rightEnd);
x.scale(textureX);
vector y = origin.myClone();
y.subtract(bottomEnd);
y.scale(textureY);
origin.add(x);
bottomEnd.add(x);
rightEnd.add(x);
origin.add(y);
bottomEnd.add(y);
rightEnd.add(y);
polygon3D p = new polygon3D(vertix3D, origin, rightEnd, bottomEnd, myTexture);
p.scaleX = scaleX;
p.scaleY = scaleY;
return p;
}
public final void update(){
for(int i = 0; i < L; i++){
tempVertix[i].set(vertix3D[i]);
tempVertix[i].subtract(camera.position);
tempVertix[i].rotate_XZ();
tempVertix[i].rotate_YZ();
tempVertix[i].updateLocation();
}
testVisibility();
}
public final void findDiffuse(){
tempVectors[0].set(LightSource.s1_);
tempVectors[0].subtract(realCentre);
tempVectors[0].unit();
double temp = tempVectors[0].dot(realNormal);
if(temp <= -0.5)
diffuse_I = ambient_I;
else
diffuse_I = ambient_I + (int)(128*(temp+0.5));
}
public final void findSpecular(){
if(diffuse_I == ambient_I){
for(int i = 0; i < vertixSpecular.length; i ++)
vertixSpecular[i] = 0;
return;
}
for(int i = 0; i < visibleCount; i++){
tempVectors[2].set(temp_vertixNormals[i]);
tempVectors[2].rotate_XZ();
tempVectors[2].rotate_YZ();
tempVectors[0].set(LightSource.s1);
tempVectors[0].subtract(vertix2D[i]);
tempVectors[0].unit();
tempVectors[1].set(tempVectors[2]);
tempVectors[1].scale(2*tempVectors[0].dot(tempVectors[1]));
tempVectors[0].subtract(tempVectors[1]);
tempVectors[0].scale(-1);
tempVectors[1].set(0,0,0);
tempVectors[1].subtract(vertix2D[i]);
tempVectors[1].unit();
double temp = tempVectors[1].dot(tempVectors[0]);
if(temp < 0)
temp = 0;
else{
for(int j = 0; j < roughness; j++)
temp*=temp;
}
vertixSpecular[i] = (int)(176 * temp) << 16;
}
}
public final void findVectorOUV(){
O.set(origin);
O.subtract(camera.position);
O.rotate_XZ(-camera.look_right);
O.rotate_YZ(camera.look_up);
U.set(rightEnd);
U.subtract(camera.position);
U.rotate_XZ(-camera.look_right);
U.rotate_YZ(camera.look_up);
V.set(bottomEnd);
V.subtract(camera.position);
V.rotate_XZ(-camera.look_right);
V.rotate_YZ(camera.look_up);
U.subtract(O);
U.unit();
U.scale(textureScaleX/scaleX);
V.subtract(O);
V.unit();
V.scale(textureScaleY/scaleY);
A = V.cross(O);
B = O.cross(U);
C = U.cross(V);
}
public final void testVisibility(){
visible = false;
//find normal vector
tempVectors[0].set(tempVertix[1]);
tempVectors[0].subtract(tempVertix[0]);
tempVectors[1].set(tempVertix[2]);
tempVectors[1].subtract(tempVertix[1]);
normal = tempVectors[0].cross(tempVectors[1]);
normal.unit();
//find centre
findCentre();
//test whether all vertix is in front of viwer's plane
for(int i = 0; i < tempVertix.length; i++){
if(tempVertix[i].z > 0){
visible = true;
break;
}
}
//test whether the polygon is within view angle
if(visible){
if(view.dot(normal) >= 0.6)
visible = false;
}
//test whether this polygon is facing toward viewer
if(visible){
tempVectors[0].set(tempVertix[0]);
if(tempVectors[0].dot(normal) >= 0)
visible = false;
}
//test whether this polygon is inside the screen
if(visible){
find_zMax_zMin();
visible = camera.screen.intersects(bound);
}
}
public final void findCentre(){
centre.reset();
for(int i = 0; i < tempVertix.length; i++)
centre.add(tempVertix[i]);
centre.scale(1.0/tempVertix.length);
}
public final void find_zMax_zMin(){
int xMax = tempVertix[0].screenX;
int xMin = xMax;
int yMax = tempVertix[0].screenY;
int yMin = yMax;
zMax = tempVertix[0].z;
zMin = zMax;
for(int i = 1; i < tempVertix.length; i++){
xMax = Math.max(xMax, t
没有合适的资源?快使用搜索试试~ 我知道了~
gallery_water.zip_gallery_water_java 3d
共70个文件
class:25个
java:25个
jpg:17个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 116 浏览量
2022-09-23
06:54:46
上传
评论
收藏 393KB ZIP 举报
温馨提示
一个java 3D程序的源代码,实现水波效果,精典
资源推荐
资源详情
资源评论
收起资源包目录
gallery_water.zip (70个子文件)
gallery
polygon3D.java 25KB
LightSource.java 256B
Ticker.java 1KB
southWall.class 2KB
camera.java 2KB
sphere.java 4KB
model.java 216B
southWall.java 2KB
texture.java 1KB
cylinder.class 3KB
solidObject.java 2KB
container.class 2KB
polygon3D.class 14KB
floor.java 2KB
eastWall.class 2KB
gameData.java 745B
sphere.class 4KB
Image
8.JPG 657B
14.jpg 20KB
1.jpg 28KB
3.jpg 1KB
2.JPG 18KB
5.JPG 657B
10.JPG 655B
6.JPG 657B
4.jpg 30KB
17.jpg 83KB
11.JPG 2KB
13.jpg 734B
16.jpg 9KB
Thumbs.db 68KB
9.JPG 657B
15.gif 64KB
12.jpg 2KB
7.JPG 657B
0.jpg 50KB
vector.class 3KB
pool.java 5KB
Ticker.class 2KB
gameData.class 820B
cylinder.java 3KB
gallery.java 6KB
westWall.java 2KB
model.class 237B
LightSource.class 613B
circle.java 5KB
cube.class 4KB
tableLamp.java 9KB
eastWall.java 2KB
geometry.java 4KB
vector.java 4KB
texture.class 1010B
tableLamp.class 6KB
camera.class 2KB
modelBuilder.class 2KB
pool.class 4KB
northWall.java 2KB
modelBuilder.java 3KB
cube.java 5KB
gallery.class 5KB
westWall.class 2KB
ceiling.java 2KB
northWall.class 2KB
ceiling.class 2KB
solidObject.class 2KB
container.java 3KB
gallery.html 146B
geometry.class 2KB
floor.class 2KB
circle.class 4KB
共 70 条
- 1
资源评论
APei
- 粉丝: 64
- 资源: 1万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功