cvs: pear /Image_3D/Image/3D/Paintable Object.php /Image_3D/docs/examples quadcube.php
| From: | Kore Nordmann | 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)));