/** * Vrací pozici (v rámci scény) pixelu rastru průmětny na souřadnicích <code>(i, j)</code>. * * @param i Vertikální souřadnice pixelu v rastru průmětny. * @param j Horizontální souřadnice pixelu v rastru průmětny. * @return Vrací bod, který popisuje polohu daného pixelu ve scéně. */ protected Point3D getPixelPosition(int i, int j) { Point3D pixelPosition = new Point3D(position); float u = ((float) (i) / (screenWidth - 1) - 0.5f) * realWidth; float v = ((float) (screenHeight - 1 - j) / (screenHeight - 1) - 0.5f) * realHeight; pixelPosition = pixelPosition.move(right.mul(u)).move(up.mul(v)); return pixelPosition; }
/** * Implicitní konstruktor. Vytvoří kameru s pozicí v počátku soustavy souřadnic scény - bod (0, 0, * 0), vektorem up (0, 0, 1), vektorem pohledu (1, 0, 0), a rozlišením rastru (100 x 100) px. */ protected AbstractCamera() { super(); position = new Point3D(); direction = new Vector3(1, 0, 0); up = new Vector3(0, 0, 1); right = direction.cross(up).normalized(); up = right.cross(direction).normalized(); screenWidth = 100; screenHeight = 100; realWidth = 2; realHeight = 2; computeRealUVSteps(); }
protected List<Point3D> getPixelPositionSuperSampledList(int i, int j, int r) { final int count = getSuperSampledCount(r); final List<Point3D> pixelPositionList = new ArrayList<>(count); Point3D currentPixelPosition = null; final float du = getSuperSampledDU(r); final float dv = getSuperSampledDV(r); for (int k = -r; k <= r; k++) { for (int l = -r; l <= r; l++) { currentPixelPosition = new Point3D(position); float u = ((float) (i) / (screenWidth - 1) - 0.5f) * realWidth + k * du; float v = ((float) (screenHeight - 1 - j) / (screenHeight - 1) - 0.5f) * realHeight + l * dv; pixelPositionList.add(currentPixelPosition.move(right.mul(u)).move(up.mul(v))); } } return pixelPositionList; }
/** * Vytvoří kameru s danými atributy. * * @param position Pozice kamery ve scéně. * @param direction Vektor určující směr pohledu kamery. * @param up Vektor určující směr nahoru. * @param screenWidth Šířka rastru průmětny. * @param screenHeight Výška rastru průmětny. */ public AbstractCamera( Point3D position, Vector3 direction, Vector3 up, int screenWidth, int screenHeight) { this.position = position; this.direction = direction.normalized(); this.up = up.normalized(); right = this.direction.cross(this.up).normalized(); this.up = right.cross(this.direction).normalized(); this.screenWidth = screenWidth; this.screenHeight = screenHeight; if (screenWidth > screenHeight) { realHeight = 2.0f; realWidth = screenWidth * realHeight / screenHeight; } else { realWidth = 2.0f; realHeight = screenHeight * realWidth / screenWidth; } computeRealUVSteps(); }