zoimt
04-06-2008, 11:02 PM
Hello there. First of all, since im new here, I want to say hello to everybody.
Inspired by this (http://www.actionscript.org/resources/articles/717/1/Simple-3D-programming-for-AS20/Page1.html) tutorial I wanted to realize a 3D cube I can rotate, translate and scale.
But every time enter the onKeyPressed() function something's going really wrong. The values in the Array Cube.pnt are wrong. I added some trace outputs to testify my values and it seems that all x values in cube now are either 0 or 300, which appears to have somethingto do with the viewportTransform methode in Main.
The values should actually be like the originals + 10.
But I actually never touch the values of Cube.pnt, just when i call the trasX and trasZ function of the cube. I assume I have a problem with only instancing instead of really copying the arrays; but following many source the Array.slice function returns a deep copy of the array instead of just creating an instance refering to it.
Ok, here is the source, I hope it's readable, I put some test-trace calls in the code you can check @ the end of this post. Take a look @
transX loop: 310
transX loop: 10
transX loop: 10
transX loop: 310
transX loop: 10
transX loop: 310
transX loop: 310
transX loop: 10
they should be more like the original value (+50 or -50) + 10, therefore 60 or -40. I cannot explain that to me, spent the whole day with arguing about this. Pls have a look at this :confused:
best regards,
Zoimt.
package {
import flash.display.MovieClip;
import flash.display.*;
import flash.events.*;
public class Main extends MovieClip {
private var points:Array; // stores points of the scene
private var index:Array; // stores lineTo() index to draw better cubes
private var xSize, ySize:int; // scenesize
private var sp:Sprite; // place to draw the scene on
private var c:Cube; // cube object
private var g:Graphics;
public function Main() {
stage.frameRate=31;
points = new Array();
index = new Array();
sp = new Sprite();
g = sp.graphics;
xSize = ySize = 300;
trace("Start. At Main(). next: c = new Cube()"); // testing
c = new Cube(50); // creates a Cube with the scale of 50 to each side from center
points = c.getPoints(); // get points of the cube
trace("Back to Mainclass. Main.points[0] (x|y|z) = " + points[0].x + points[0].y + points[0].z);
index = c.getIndex();
points = perspectiveDivision(points);
points = viewportTransform(points);
addChild(sp);
drawScene();
stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyPressed);
}
public function drawScene() {
g.lineStyle(1, 0x000000);
for (var i:int = 0; i < index.length; i++) {
g.moveTo(points[index[i][0]].x, points[index[i][0]].y);
for (var j = 1; j < 4; j++) {
g.lineTo(points[index[i][j]].x, points[index[i][j]].y);
}
g.lineTo(points[index[i][0]].x, points[index[i][0]].y);
}
}
private function onKeyPressed(evt:KeyboardEvent):void {
g.clear();
trace("Now @ Main.onKeyPressed. cube p0x " + c.getPoints()[0].x);
c.transX(10);
c.transZ(-10);
trace("Back to Main.onKeypressed");
points = new Array(); //clear old points
index = new Array(); //clear old indices
points = c.getPoints();
for (var i:int = 0; i < points.length; i++) {
trace("transX loop: " + points[i].x);
}
index = c.getIndex();
points = perspectiveDivision(points);
for (var i:int = 0; i < points.length; i++) {
trace("perspDevided x: " + points[i].x);
}
points = viewportTransform(points)
drawScene();
}
public function perspectiveDivision(points:Array) {
// goes through the array and divides its x and y values by its z values
var tmp:Array = points.slice(0, points.length);
for (var i:int; i < points.length; i++) {
trace("tmpX b4 perspDev " + tmp[i].x + " and Z equals: " + points[i].z);
tmp[i].x = tmp[i].x / tmp[i].z;
tmp[i].y = tmp[i].y / tmp[i].z;
trace("tmpX after perspDev " + tmp[i].x);
}
return tmp.slice(0, tmp.length);
}
public function viewportTransform(points:Array) {
// multiplies resuslting values
var tmp:Array = points.slice(0, points.length);
for (var i:int; i< points.length; i++) {
tmp[i].x = 0.5 * (tmp[i].x + 1) * xSize;
tmp[i].y = 0.5 * (tmp[i].y + 1) * ySize;
trace("Viewportpunkt " + i + " x: " + tmp[i].x);
trace("Viewportpunkt " + i + " y: " + tmp[i].y);
}
return tmp.slice(0, tmp.length);
}
public function arrayCopy(a:Array) {
return a.slice(0,a.length);
}
}
}
And here's the Cube:
package{
public class Cube {
private var pts, ref, index:Array;
private var scal:int;
public function Cube(scal:int) {
this.scal = scal;
trace("Constructor of Cube. scale value is:" + this.scal);
pts = new Array();
index = new Array();
trace("generateCube(scal); just a reminder: scal = " + scal);
generateCube(scal);
this.ref = pts.slice(0,pts.length);
}
public function getScale() {
return scal;
}
public function setScale(scal:int) {
this.scal = scal;
generateCube(scal);
}
public function getPoints() {
trace("p0x @ getPoints: " + pts[0].x);
return pts.slice(0, pts.length);
}
public function setPoints(pts:Array):void {
this.pts = pts;
}
public function getIndex() {
return index.slice(0, index.length);
}
public function generateCube(scal:int):void {
// creates pointmatrix
trace("now @ generateCube(). The scalevalue still is:" + scal);
pts.push({x:-scal, y:-scal, z:-scal});
trace("Cube.pts[0] (x|y|z): " + pts[0].x + pts[0].y + pts[0].z);
pts.push({x:scal, y:-scal, z:-scal});
pts.push({x:scal, y:scal, z:-scal});
pts.push({x:-scal, y:scal, z:-scal});
pts.push({x:-scal, y:-scal, z:scal});
pts.push({x:scal, y:-scal, z:scal});
pts.push({x:scal, y:scal, z:scal});
pts.push({x:-scal, y:scal, z:scal});
// indicates line-draw order
index.push([0, 1, 2, 3]);
index.push([4, 5, 6, 7]);
index.push([0, 4, 7, 3]);
index.push([0, 1, 5, 4]);
index.push([1, 5, 6, 2]);
index.push([3, 7, 6, 2]);
}
public function transX(transX:int):void {
trace("now @ Cube.transX. transX-factor= " + transX);
for (var i:int = 0; i < pts.length; i++) {
pts[i].x += transX;
trace("transX loop: " + pts[i].x);
}
}
public function trasnY(transY:int):void {
for (var i:int = 0; i < pts.length; i++) {
pts[i].y += transY;
}
}
public function transZ(transZ:int):void {
for (var i:int = 0; i < pts.length; i++) {
pts[i].z += transZ;
}
}
}
}
And this is the Output:
Start. At Main(). next: c = new Cube()
Constructor of Cube. scale value is:50
generateCube(scal); just a reminder: scal = 50
now @ generateCube(). The scalevalue still is:50
Cube.pts[0] (x|y|z): -50-50-50
p0x @ getPoints: -50
Back to Mainclass. Main.points[0] (x|y|z) = -50-50-50
tmpX b4 perspDev -50 and Z equals: -50
tmpX after perspDev 1
tmpX b4 perspDev 50 and Z equals: -50
tmpX after perspDev -1
tmpX b4 perspDev 50 and Z equals: -50
tmpX after perspDev -1
tmpX b4 perspDev -50 and Z equals: -50
tmpX after perspDev 1
tmpX b4 perspDev -50 and Z equals: 50
tmpX after perspDev -1
tmpX b4 perspDev 50 and Z equals: 50
tmpX after perspDev 1
tmpX b4 perspDev 50 and Z equals: 50
tmpX after perspDev 1
tmpX b4 perspDev -50 and Z equals: 50
tmpX after perspDev -1
Viewportpunkt 0 x: 300
Viewportpunkt 0 y: 300
Viewportpunkt 1 x: 0
Viewportpunkt 1 y: 300
Viewportpunkt 2 x: 0
Viewportpunkt 2 y: 0
Viewportpunkt 3 x: 300
Viewportpunkt 3 y: 0
Viewportpunkt 4 x: 0
Viewportpunkt 4 y: 0
Viewportpunkt 5 x: 300
Viewportpunkt 5 y: 0
Viewportpunkt 6 x: 300
Viewportpunkt 6 y: 300
Viewportpunkt 7 x: 0
Viewportpunkt 7 y: 300
p0x @ getPoints: 300
Now @ Main.onKeyPressed. cube p0x 300
now @ Cube.transX. transX-factor= 10
transX loop: 310
transX loop: 10
transX loop: 10
transX loop: 310
transX loop: 10
transX loop: 310
transX loop: 310
transX loop: 10
Back to Main.onKeypressed
p0x @ getPoints: 310
transX loop: 310
transX loop: 10
transX loop: 10
transX loop: 310
transX loop: 10
transX loop: 310
transX loop: 310
transX loop: 10
tmpX b4 perspDev 310 and Z equals: -60
tmpX after perspDev -5.166666666666667
tmpX b4 perspDev 10 and Z equals: -60
tmpX after perspDev -0.16666666666666666
tmpX b4 perspDev 10 and Z equals: -60
tmpX after perspDev -0.16666666666666666
tmpX b4 perspDev 310 and Z equals: -60
tmpX after perspDev -5.166666666666667
tmpX b4 perspDev 10 and Z equals: 40
tmpX after perspDev 0.25
tmpX b4 perspDev 310 and Z equals: 40
tmpX after perspDev 7.75
tmpX b4 perspDev 310 and Z equals: 40
tmpX after perspDev 7.75
tmpX b4 perspDev 10 and Z equals: 40
tmpX after perspDev 0.25
perspDevided x: -5.166666666666667
perspDevided x: -0.16666666666666666
perspDevided x: -0.16666666666666666
perspDevided x: -5.166666666666667
perspDevided x: 0.25
perspDevided x: 7.75
perspDevided x: 7.75
perspDevided x: 0.25
Viewportpunkt 0 x: -625
Viewportpunkt 0 y: -600
Viewportpunkt 1 x: 125
Viewportpunkt 1 y: -600
Viewportpunkt 2 x: 125
Viewportpunkt 2 y: 150
Viewportpunkt 3 x: -625
Viewportpunkt 3 y: 150
Viewportpunkt 4 x: 187.5
Viewportpunkt 4 y: 150
Viewportpunkt 5 x: 1312.5
Viewportpunkt 5 y: 150
Viewportpunkt 6 x: 1312.5
Viewportpunkt 6 y: 1275
Viewportpunkt 7 x: 187.5
Viewportpunkt 7 y: 1275
Inspired by this (http://www.actionscript.org/resources/articles/717/1/Simple-3D-programming-for-AS20/Page1.html) tutorial I wanted to realize a 3D cube I can rotate, translate and scale.
But every time enter the onKeyPressed() function something's going really wrong. The values in the Array Cube.pnt are wrong. I added some trace outputs to testify my values and it seems that all x values in cube now are either 0 or 300, which appears to have somethingto do with the viewportTransform methode in Main.
The values should actually be like the originals + 10.
But I actually never touch the values of Cube.pnt, just when i call the trasX and trasZ function of the cube. I assume I have a problem with only instancing instead of really copying the arrays; but following many source the Array.slice function returns a deep copy of the array instead of just creating an instance refering to it.
Ok, here is the source, I hope it's readable, I put some test-trace calls in the code you can check @ the end of this post. Take a look @
transX loop: 310
transX loop: 10
transX loop: 10
transX loop: 310
transX loop: 10
transX loop: 310
transX loop: 310
transX loop: 10
they should be more like the original value (+50 or -50) + 10, therefore 60 or -40. I cannot explain that to me, spent the whole day with arguing about this. Pls have a look at this :confused:
best regards,
Zoimt.
package {
import flash.display.MovieClip;
import flash.display.*;
import flash.events.*;
public class Main extends MovieClip {
private var points:Array; // stores points of the scene
private var index:Array; // stores lineTo() index to draw better cubes
private var xSize, ySize:int; // scenesize
private var sp:Sprite; // place to draw the scene on
private var c:Cube; // cube object
private var g:Graphics;
public function Main() {
stage.frameRate=31;
points = new Array();
index = new Array();
sp = new Sprite();
g = sp.graphics;
xSize = ySize = 300;
trace("Start. At Main(). next: c = new Cube()"); // testing
c = new Cube(50); // creates a Cube with the scale of 50 to each side from center
points = c.getPoints(); // get points of the cube
trace("Back to Mainclass. Main.points[0] (x|y|z) = " + points[0].x + points[0].y + points[0].z);
index = c.getIndex();
points = perspectiveDivision(points);
points = viewportTransform(points);
addChild(sp);
drawScene();
stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyPressed);
}
public function drawScene() {
g.lineStyle(1, 0x000000);
for (var i:int = 0; i < index.length; i++) {
g.moveTo(points[index[i][0]].x, points[index[i][0]].y);
for (var j = 1; j < 4; j++) {
g.lineTo(points[index[i][j]].x, points[index[i][j]].y);
}
g.lineTo(points[index[i][0]].x, points[index[i][0]].y);
}
}
private function onKeyPressed(evt:KeyboardEvent):void {
g.clear();
trace("Now @ Main.onKeyPressed. cube p0x " + c.getPoints()[0].x);
c.transX(10);
c.transZ(-10);
trace("Back to Main.onKeypressed");
points = new Array(); //clear old points
index = new Array(); //clear old indices
points = c.getPoints();
for (var i:int = 0; i < points.length; i++) {
trace("transX loop: " + points[i].x);
}
index = c.getIndex();
points = perspectiveDivision(points);
for (var i:int = 0; i < points.length; i++) {
trace("perspDevided x: " + points[i].x);
}
points = viewportTransform(points)
drawScene();
}
public function perspectiveDivision(points:Array) {
// goes through the array and divides its x and y values by its z values
var tmp:Array = points.slice(0, points.length);
for (var i:int; i < points.length; i++) {
trace("tmpX b4 perspDev " + tmp[i].x + " and Z equals: " + points[i].z);
tmp[i].x = tmp[i].x / tmp[i].z;
tmp[i].y = tmp[i].y / tmp[i].z;
trace("tmpX after perspDev " + tmp[i].x);
}
return tmp.slice(0, tmp.length);
}
public function viewportTransform(points:Array) {
// multiplies resuslting values
var tmp:Array = points.slice(0, points.length);
for (var i:int; i< points.length; i++) {
tmp[i].x = 0.5 * (tmp[i].x + 1) * xSize;
tmp[i].y = 0.5 * (tmp[i].y + 1) * ySize;
trace("Viewportpunkt " + i + " x: " + tmp[i].x);
trace("Viewportpunkt " + i + " y: " + tmp[i].y);
}
return tmp.slice(0, tmp.length);
}
public function arrayCopy(a:Array) {
return a.slice(0,a.length);
}
}
}
And here's the Cube:
package{
public class Cube {
private var pts, ref, index:Array;
private var scal:int;
public function Cube(scal:int) {
this.scal = scal;
trace("Constructor of Cube. scale value is:" + this.scal);
pts = new Array();
index = new Array();
trace("generateCube(scal); just a reminder: scal = " + scal);
generateCube(scal);
this.ref = pts.slice(0,pts.length);
}
public function getScale() {
return scal;
}
public function setScale(scal:int) {
this.scal = scal;
generateCube(scal);
}
public function getPoints() {
trace("p0x @ getPoints: " + pts[0].x);
return pts.slice(0, pts.length);
}
public function setPoints(pts:Array):void {
this.pts = pts;
}
public function getIndex() {
return index.slice(0, index.length);
}
public function generateCube(scal:int):void {
// creates pointmatrix
trace("now @ generateCube(). The scalevalue still is:" + scal);
pts.push({x:-scal, y:-scal, z:-scal});
trace("Cube.pts[0] (x|y|z): " + pts[0].x + pts[0].y + pts[0].z);
pts.push({x:scal, y:-scal, z:-scal});
pts.push({x:scal, y:scal, z:-scal});
pts.push({x:-scal, y:scal, z:-scal});
pts.push({x:-scal, y:-scal, z:scal});
pts.push({x:scal, y:-scal, z:scal});
pts.push({x:scal, y:scal, z:scal});
pts.push({x:-scal, y:scal, z:scal});
// indicates line-draw order
index.push([0, 1, 2, 3]);
index.push([4, 5, 6, 7]);
index.push([0, 4, 7, 3]);
index.push([0, 1, 5, 4]);
index.push([1, 5, 6, 2]);
index.push([3, 7, 6, 2]);
}
public function transX(transX:int):void {
trace("now @ Cube.transX. transX-factor= " + transX);
for (var i:int = 0; i < pts.length; i++) {
pts[i].x += transX;
trace("transX loop: " + pts[i].x);
}
}
public function trasnY(transY:int):void {
for (var i:int = 0; i < pts.length; i++) {
pts[i].y += transY;
}
}
public function transZ(transZ:int):void {
for (var i:int = 0; i < pts.length; i++) {
pts[i].z += transZ;
}
}
}
}
And this is the Output:
Start. At Main(). next: c = new Cube()
Constructor of Cube. scale value is:50
generateCube(scal); just a reminder: scal = 50
now @ generateCube(). The scalevalue still is:50
Cube.pts[0] (x|y|z): -50-50-50
p0x @ getPoints: -50
Back to Mainclass. Main.points[0] (x|y|z) = -50-50-50
tmpX b4 perspDev -50 and Z equals: -50
tmpX after perspDev 1
tmpX b4 perspDev 50 and Z equals: -50
tmpX after perspDev -1
tmpX b4 perspDev 50 and Z equals: -50
tmpX after perspDev -1
tmpX b4 perspDev -50 and Z equals: -50
tmpX after perspDev 1
tmpX b4 perspDev -50 and Z equals: 50
tmpX after perspDev -1
tmpX b4 perspDev 50 and Z equals: 50
tmpX after perspDev 1
tmpX b4 perspDev 50 and Z equals: 50
tmpX after perspDev 1
tmpX b4 perspDev -50 and Z equals: 50
tmpX after perspDev -1
Viewportpunkt 0 x: 300
Viewportpunkt 0 y: 300
Viewportpunkt 1 x: 0
Viewportpunkt 1 y: 300
Viewportpunkt 2 x: 0
Viewportpunkt 2 y: 0
Viewportpunkt 3 x: 300
Viewportpunkt 3 y: 0
Viewportpunkt 4 x: 0
Viewportpunkt 4 y: 0
Viewportpunkt 5 x: 300
Viewportpunkt 5 y: 0
Viewportpunkt 6 x: 300
Viewportpunkt 6 y: 300
Viewportpunkt 7 x: 0
Viewportpunkt 7 y: 300
p0x @ getPoints: 300
Now @ Main.onKeyPressed. cube p0x 300
now @ Cube.transX. transX-factor= 10
transX loop: 310
transX loop: 10
transX loop: 10
transX loop: 310
transX loop: 10
transX loop: 310
transX loop: 310
transX loop: 10
Back to Main.onKeypressed
p0x @ getPoints: 310
transX loop: 310
transX loop: 10
transX loop: 10
transX loop: 310
transX loop: 10
transX loop: 310
transX loop: 310
transX loop: 10
tmpX b4 perspDev 310 and Z equals: -60
tmpX after perspDev -5.166666666666667
tmpX b4 perspDev 10 and Z equals: -60
tmpX after perspDev -0.16666666666666666
tmpX b4 perspDev 10 and Z equals: -60
tmpX after perspDev -0.16666666666666666
tmpX b4 perspDev 310 and Z equals: -60
tmpX after perspDev -5.166666666666667
tmpX b4 perspDev 10 and Z equals: 40
tmpX after perspDev 0.25
tmpX b4 perspDev 310 and Z equals: 40
tmpX after perspDev 7.75
tmpX b4 perspDev 310 and Z equals: 40
tmpX after perspDev 7.75
tmpX b4 perspDev 10 and Z equals: 40
tmpX after perspDev 0.25
perspDevided x: -5.166666666666667
perspDevided x: -0.16666666666666666
perspDevided x: -0.16666666666666666
perspDevided x: -5.166666666666667
perspDevided x: 0.25
perspDevided x: 7.75
perspDevided x: 7.75
perspDevided x: 0.25
Viewportpunkt 0 x: -625
Viewportpunkt 0 y: -600
Viewportpunkt 1 x: 125
Viewportpunkt 1 y: -600
Viewportpunkt 2 x: 125
Viewportpunkt 2 y: 150
Viewportpunkt 3 x: -625
Viewportpunkt 3 y: 150
Viewportpunkt 4 x: 187.5
Viewportpunkt 4 y: 150
Viewportpunkt 5 x: 1312.5
Viewportpunkt 5 y: 150
Viewportpunkt 6 x: 1312.5
Viewportpunkt 6 y: 1275
Viewportpunkt 7 x: 187.5
Viewportpunkt 7 y: 1275