[yt-svn] commit/yt: MatthewTurk: First pass at fisheye rendering
Bitbucket
commits-noreply at bitbucket.org
Tue Dec 13 13:04:30 PST 2011
1 new commit in yt:
https://bitbucket.org/yt_analysis/yt/changeset/f3e76b71172a/
changeset: f3e76b71172a
branch: yt
user: MatthewTurk
date: 2011-12-13 21:35:41
summary: First pass at fisheye rendering
affected #: 2 files
diff -r cfbf69a67089d5d8f83d7436d233eb57c925a3a8 -r f3e76b71172ac873f7322b3e1ca7959a788055dd yt/utilities/_amr_utils/VolumeIntegrator.pyx
--- a/yt/utilities/_amr_utils/VolumeIntegrator.pyx
+++ b/yt/utilities/_amr_utils/VolumeIntegrator.pyx
@@ -65,6 +65,9 @@
double log2(double x)
long int lrint(double x)
double fabs(double x)
+ double cos(double x)
+ double sin(double x)
+ double asin(double x)
cdef struct Triangle:
Triangle *next
@@ -238,6 +241,33 @@
tr[i] = ipnest
return tr
+def arr_fisheye_vectors(int resolution, np.float64_t fov):
+ # We now follow figures 4-7 of:
+ # http://paulbourke.net/miscellaneous/domefisheye/fisheye/
+ # ...but all in Cython.
+ cdef np.ndarray[np.float64_t, ndim=3] vp
+ cdef int i, j, k
+ cdef np.float64_t r, phi, theta, px, py
+ cdef np.float64_t pi = 3.1415926
+ cdef np.float64_t fov_rad = fov * pi / 180.0
+ vp = np.zeros((resolution, resolution, 3), dtype="float64")
+ for i in range(resolution):
+ px = 2.0 * i / (resolution) - 1.0
+ for j in range(resolution):
+ py = 2.0 * j / (resolution) - 1.0
+ r = (px*px + py*py)**0.5
+ if r == 0.0:
+ phi = 0.0
+ elif px < 0:
+ phi = pi - asin(py / r)
+ else:
+ phi = asin(py / r)
+ theta = r * fov_rad / 2.0
+ vp[i,j,0] = sin(theta) * cos(phi)
+ vp[i,j,1] = sin(theta) * sin(phi)
+ vp[i,j,2] = cos(theta)
+ return vp
+
cdef class star_kdtree_container:
cdef kdtree_utils.kdtree *tree
cdef public np.float64_t sigma
diff -r cfbf69a67089d5d8f83d7436d233eb57c925a3a8 -r f3e76b71172ac873f7322b3e1ca7959a788055dd yt/visualization/volume_rendering/camera.py
--- a/yt/visualization/volume_rendering/camera.py
+++ b/yt/visualization/volume_rendering/camera.py
@@ -32,7 +32,7 @@
from yt.utilities.amr_utils import TransferFunctionProxy, VectorPlane, \
arr_vec2pix_nest, arr_pix2vec_nest, AdaptiveRaySource, \
- arr_ang2pix_nest
+ arr_ang2pix_nest, arr_fisheye_vectors
from yt.visualization.image_writer import write_bitmap
from yt.data_objects.data_containers import data_object_registry
from yt.utilities.parallel_tools.parallel_analysis_interface import \
@@ -793,6 +793,59 @@
oc.sub_samples, oc.pf)
return (left_camera, right_camera)
+class FisheyeCamera(Camera):
+ def __init__(self, center, radius, fov, resolution,
+ transfer_function = None, fields = None,
+ sub_samples = 5, log_fields = None, volume = None,
+ pf = None, no_ghost=False):
+ ParallelAnalysisInterface.__init__(self)
+ if pf is not None: self.pf = pf
+ self.center = na.array(center, dtype='float64')
+ self.radius = radius
+ self.fov = fov
+ if iterable(resolution):
+ raise RuntimeError("Resolution must be a single int")
+ self.resolution = resolution
+ if transfer_function is None:
+ transfer_function = ProjectionTransferFunction()
+ self.transfer_function = transfer_function
+ if fields is None: fields = ["Density"]
+ self.fields = fields
+ self.sub_samples = sub_samples
+ self.log_fields = log_fields
+ if volume is None:
+ volume = AMRKDTree(self.pf, fields=self.fields, no_ghost=no_ghost,
+ log_fields=log_fields)
+ self.volume = volume
+
+ def snapshot(self):
+ image = na.zeros((self.resolution**2,1,3), dtype='float64', order='C')
+ # We now follow figures 4-7 of:
+ # http://paulbourke.net/miscellaneous/domefisheye/fisheye/
+ # ...but all in Cython.
+ vp = arr_fisheye_vectors(self.resolution, self.fov)
+ vp.shape = (self.resolution**2,1,3)
+ uv = na.ones(3, dtype='float64')
+ positions = na.ones((self.resolution**2, 1, 3), dtype='float64') * self.center
+ vector_plane = VectorPlane(positions, vp, self.center,
+ (0.0, 1.0, 0.0, 1.0), image, uv, uv)
+ tfp = TransferFunctionProxy(self.transfer_function)
+ tfp.ns = self.sub_samples
+ self.volume.initialize_source()
+ mylog.info("Rendering fisheye of %s^2", self.resolution)
+ pbar = get_pbar("Ray casting",
+ (self.volume.brick_dimensions + 1).prod(axis=-1).sum())
+
+ total_cells = 0
+ for brick in self.volume.traverse(None, self.center, image):
+ brick.cast_plane(tfp, vector_plane)
+ total_cells += na.prod(brick.my_data[0].shape)
+ pbar.update(total_cells)
+ pbar.finish()
+ image.shape = (self.resolution, self.resolution, 3)
+ return image
+
+
def off_axis_projection(pf, center, normal_vector, width, resolution,
field, weight = None, volume = None, no_ghost = True):
r"""Project through a parameter file, off-axis, and return the image plane.
Repository URL: https://bitbucket.org/yt_analysis/yt/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
More information about the yt-svn
mailing list