cvs: pear /Image_3D/Image/3D/Paintable Object.php /Image_3D/docs/examples quadcube.php

From: Date: Wed, 22 Mar 2006 13:10:30 +0000
Subject: cvs: pear /Image_3D/Image/3D/Paintable Object.php /Image_3D/docs/examples quadcube.php
Groups: php.pear.cvs 
Request: Send a blank email to pear-cvs+get-39239@lists.php.net to get a copy of this message
kore Wed Mar 22 13:10:30 2006 UTC Modified files: /pear/Image_3D/Image/3D/Paintable Object.php /pear/Image_3D/docs/examples quadcube.php Log: - Started with implementation of Catmull-Clark algorithm for subdivision surfaces http://cvs.php.net/viewcvs.cgi/pear/Image_3D/Image/3D/Paintable/Object.php?r1=1.6&r2=1.7&diff_format=u Index: pear/Image_3D/Image/3D/Paintable/Object.php diff -u pear/Image_3D/Image/3D/Paintable/Object.php:1.6 pear/Image_3D/Image/3D/Paintable/Object.php:1.7 --- pear/Image_3D/Image/3D/Paintable/Object.php:1.6 Tue Mar 21 22:49:00 2006 +++ pear/Image_3D/Image/3D/Paintable/Object.php Wed Mar 22 13:10:30 2006 @@ -27,7 +27,7 @@ * @author Kore Nordmann <3d@kore-nordmann.de> * @copyright 1997-2005 Kore Nordmann * @license http://www.gnu.org/licenses/lgpl.txt lgpl 2.1 - * @version CVS: $Id: Object.php,v 1.6 2006/03/21 22:49:00 kore Exp $ + * @version CVS: $Id: Object.php,v 1.7 2006/03/22 13:10:30 kore Exp $ * @link http://pear.php.net/package/PackageName * @since File available since Release 0.1.0 */ @@ -81,7 +81,7 @@ $this->_polygones[] = $polygon; } - public function buildInzidenzGraph() { + protected function _buildInzidenzGraph() { $polygons = $this->getPolygones(); $surfaces = array(); @@ -146,6 +146,88 @@ 'points' => $points, ); } + + public function subdivisionSurfaces($factor = 1) { + $data = $this->_buildInzidenzGraph(); + + // Additional hash maps + $edge_surfaces = array(); + $point_edges = array(); + + // New calculated points + $face_points = array(); + $edge_points = array(); + $old_points = array(); + + // Calculate "face points" + foreach ($data['surfaces'] as $surface => $edges) { + // Get all points + $points = array(); + foreach ($edges as $edge) { + $points = array_merge($points, $data['edges'][$edge]); + $edge_surfaces[$edge][] = $surface; + } + $points = array_unique($points); + + // Calculate average + $face_point = array(0, 0, 0); + $point_count = count($points); + foreach ($points as $point) { + $face_point[0] += $data['points'][$point]->getX() / $point_count; + $face_point[1] += $data['points'][$point]->getY() / $point_count; + $face_point[2] += $data['points'][$point]->getZ() / $point_count; + } + + // Create face point + $face_points[$surface] = new Image_3D_Point($face_point[0], $face_point[1], $face_point[2]); + } + + // Calculate "edge points" + foreach ($data['edges'] as $edge => $points) { + // Calculate middle of edge + $edge_middle = array(0, 0, 0); + $point_count = count($points); + foreach ($points as $point) { + $point_edges[$point][] = $edge; + $edge_middle[0] += $data['points'][$point]->getX() / $point_count; + $edge_middle[1] += $data['points'][$point]->getY() / $point_count; + $edge_middle[2] += $data['points'][$point]->getZ() / $point_count; + } + + // Calculate average of the adjacent faces + $average_face = array(0, 0, 0); + $point_count = count($edge_surfaces[$edge]); + foreach ($edge_surfaces[$edge] as $surface) { + $average_face[0] += $face_points[$surface]->getX() / $point_count; + $average_face[1] += $face_points[$surface]->getY() / $point_count; + $average_face[2] += $face_points[$surface]->getZ() / $point_count; + } + + // Create edge point on this base + $edge_points[$edge] = new Image_3D_Point(($average_face[0] + $edge_middle[0]) / 2, ($average_face[1] + $edge_middle[1]) / 2, ($average_face[2] + $edge_middle[2]) / 2); + } + + // Reposition old vertices + foreach ($data['points'] as $point => $value) { + // Calculate average of surrounding face points + $q = array(0, 0, 0); + // @TODO: implement + + // Calculate average of midpoints of adjacent edges + $r = array(0, 0, 0); + // @TODO: implement + + // Create new edge point + $n = count($point_edges[$point]); + $old_points[$point] = new Image_3D_Point( + ($q[0] / $n) + ((2 * $r[0]) / $n) + (($value->getX() * ($n - 3)) / $n), + ($q[1] / $n) + ((2 * $r[1]) / $n) + (($value->getY() * ($n - 3)) / $n), + ($q[2] / $n) + ((2 * $r[2]) / $n) + (($value->getZ() * ($n - 3)) / $n) + ); + } + + // Create polygones on new points + // @TODO: implement + } } -?> http://cvs.php.net/viewcvs.cgi/pear/Image_3D/docs/examples/quadcube.php?r1=1.1&r2=1.2&diff_format=u Index: pear/Image_3D/docs/examples/quadcube.php diff -u pear/Image_3D/docs/examples/quadcube.php:1.1 pear/Image_3D/docs/examples/quadcube.php:1.2 --- pear/Image_3D/docs/examples/quadcube.php:1.1 Tue Mar 21 22:49:00 2006 +++ pear/Image_3D/docs/examples/quadcube.php Wed Mar 22 13:10:30 2006 @@ -11,7 +11,7 @@ $cube = $world->createObject('quadcube', array(150, 150, 150)); $cube->setColor(new Image_3D_Color(50, 50, 250, 150)); -$cube->buildInzidenzGraph(); +$cube->subdivisionSurfaces(1); $world->transform($world->createMatrix('Rotation', array(15, 15, 0)));

« previous php.pear.cvs (#39239) next »