|
parele, Jr. Member
Posted: 12 March 2013 04:47 AM Total Posts: 43
Import Away3d.everything.*.
var plane = new Mesh(newPlaneGeometry(2500,2500,100,100,true),new TextureMaterial(Cast.bitmapTexture(groundMaterial))); plane.geometry.scaleUV(25, 25); plane.castsShadows = true; plane.material.repeat = true plane.mouseEnabled = true;
Above creates a plane, What im trying to do is get the mouse to grab on to closest vertex or on my over vertex of my mesh:
var vertex:Vector.<Number> = plane.geometry.subGeometries[0].vertexData;
Anyway i get lost here: below is a picture of what im trying to achieve
|
parele, Jr. Member
Posted: 12 March 2013 01:33 PM Total Posts: 43
[ # 1 ]
I realize i can get the vertex raw data but i dont have a clue how to translate it to the mouse position on the mesh
var index:Vector.<uint > = plane.geometry.subGeometries[0].indexData; var vertexData:Vector.<Number > = plane.geometry.subGeometries[0].vertexData;
for (var i:uint = 0; i < index.length; i++) { ind = index[i] * 3;
trace(vertex[ind] , vertex[ind+1], vertex[ind + 2]); }
|
beers, Member
Posted: 12 March 2013 02:53 PM Total Posts: 53
[ # 2 ]
I’ve used this technique to map a bounding box vertex list to screen space before - I assume it would work just as well for any vertex list.
yourMesh.sceneTransform.transformVectors(vertexlist,outputlist) where vertexlist is the vertex array from your example
view.project(outputlist…) go through the outputlist above and transform each vertex to screen space
beers
|
parele, Jr. Member
Posted: 12 March 2013 03:30 PM Total Posts: 43
[ # 3 ]
I think i may understand, this is only a hobbie to me..
So far i have been looping example:
function moving_mouseOver_the_Plane(e:MouseEvent3D):void
for (var i:uint = 0; i < index.length; i++) { ind = index[i] * 3; if(mymouse.position.x ==vertex[ind]){ anotherMesh.positi Vector3D(vertex[ind],vertex[ind+1],vertex[ind + 2]);
}
|
parele, Jr. Member
Posted: 13 March 2013 12:18 AM Total Posts: 43
[ # 4 ]
I cant get this to work, iv played around with this but i dont understand where the outputlist came from,
var gridOver = new WireframePlane(100,100,1,1,0xFF3C,2); var plane = new Mesh(new PlaneGeometry(2500,2500,50,50,true),new TextureMaterial(Cast.bitmapTexture(groundMaterial))); plane.geometry.scaleUV(25, 25); plane.material.repeat = true; plane.mouseEnabled = true; plane.addEventListener(MouseEvent3D.MOUSE_DOWN, MouseOverPlane);
var tiles_local; var outputlist:Array = new Array(x,y,z) var index:Vector.<uint > = plane.geometry.subGeometries[0].indexData; var vertex:Vector.<Number > = plane.geometry.subGeometries[0].vertexData;
for (var i:uint = 0; i < index.length; i++) { ind = index[i] * 3; vertexlist.push (vertex[ind] , vertex[ind+1], vertex[ind + 2]); trace(vertex[ind] , vertex[ind+1], vertex[ind + 2]); plane.sceneTransform.transformVectors(vertexlist,outputlist) _container.project(outputlist) }
function MouseOverPlane(e:MouseEvent3D):void { localPositi plane.position ); tiles_local = e.localPosition;//its a small plane Mesh gridOver.positi plane mesh follows mouse //Here i want mouse to tell me what vertex it hits or near //either way i can use this, }
By looking at the picture basically im trying to lock the green tile to the closest mouse position to the bigplane vertex along any x,z axis so when i place the item it will only be placed at the co-ordinates.
|
beers, Member
Posted: 13 March 2013 01:04 AM Total Posts: 53
[ # 5 ]
outputlist is a Vector.<Number> array so you need to set it up that way:
var vertexlist:Vector.<Number > = plane.geometry.subGeometries[0].vertexData;
var outputlist:Vector.<Number> = new <Number>[vertexlist.length];
plane.sceneTransform.transformVectors(vertexlist,outputlist);
now outputlist has all the transformed vertices. Use view.project on each vertex in that list in a loop , comparing the output to your mouse.x & mouse.y for the closest match. You’ll have to code the logic there.
Another technique is just do a racast, and find the face index you hit, and grab the vertices that way. Can’t help with that though, since im not an expert on away3d raycasting yet.
beers
|
parele, Jr. Member
Posted: 13 March 2013 04:34 AM Total Posts: 43
[ # 6 ]
I appreciate the time you have giving me, i will get back to you soon with my outcome, thanks again
|
parele, Jr. Member
Posted: 13 March 2013 06:59 AM Total Posts: 43
[ # 7 ]
Im doing something wrong here, my loop is giving me other values that have nothing to do with the vertices, iv attached an image:
var plane = new Mesh(new PlaneGeometry(500,500,20,20,true) plane.geometry.scaleUV(25, 25); plane.material.repeat = true; plane.mouseEnabled = true; plane.addEventListener(MouseEvent3D.MOUSE_DOWN, haha2);
var meshHolder:Array = new Array(); var vertexlist:Vector.<Number > = plane.geometry.subGeometries[0].vertexData; var outputlist:Vector.<Number> = new <Number>[vertexlist.length]; plane.sceneTransform.transformVectors(vertexlist,outputlist); var index:Vector.<uint > = plane.geometry.subGeometries[0].indexData; var MeshHolder:Array = new Array(); var ind:uint = 0;
for (var i:uint = 0; i < index.length; i++) { ind = index[i] * 1; //trace(vertex[ind] , vertex[ind+1], vertex[ind + 2]); var allLocations:Vector3D = new Vector3D(outputlist[ind+3],0,outputlist[ind+2]); var verticesPlane = new WireframePlane(100,100,1,1,0xFF3C,2); MeshHolder.push(verticesPlane); verticesPlane.positi MyView.addChild(verticesPlane); trace(outputlist[ind],outputlist[ind+1],outputlist[ind + 2]); // Think i need a loop inside this loop/
}
you will notice that my green planes (verticesPlane) are not correct over the mesh if everything is correct they should fill a Grid pattern over the whole mesh to represent where the vertices position are(x,y,z) on my plane
|
beers, Member
Posted: 13 March 2013 05:37 PM Total Posts: 53
[ # 8 ]
This works for me. Snaps to the nearest vertex perfectly.
private var plane:Mesh; private var dummy:Mesh;
private function initObjects():void { plane = new Mesh(new PlaneGeometry(500, 500, 20, 20, true)); plane.mouseEnabled = true; plane.addEventListener(MouseEvent3D.MOUSE_DOWN, testDown); scene.addChild(plane); dummy=new Mesh( new CubeGeometry(3,3,3,1,1,1,true), new ColorMaterial( 0x00FF00, 1 ) ); scene.addChild(dummy); }
private function testDown(event:MouseEvent3D):void { var dst:Number = 1000; var idx:Number = 0; var va:Vector3D; var vb:Vector3D = new Vector3D(stage.mouseX, stage.mouseY, 0); var vertexlist:Vector.<Number> = plane.geometry.subGeometries[0].vertexData; var outputlist:Vector.<Number> = new Vector.<Number>(vertexlist.length);
plane.sceneTransform.transformVectors(vertexlist, outputlist); for (var c:Number = 0; c < outputlist.length; c+=3) { va = view.project(new Vector3D(outputlist[c], outputlist[c + 1], outputlist[c + 2])); va.z = 0; var tmp:Number = Vector3D.distance(va, vb); if (tmp < dst) { dst = tmp; idx = c; } } dummy.positi = new Vector3D(vertexlist[idx],vertexlist[idx+1],vertexlist[idx+2]); }
|
parele, Jr. Member
Posted: 13 March 2013 11:50 PM Total Posts: 43
[ # 9 ]
thank you, i think i have fixed it//
var vertexlist:Vector.<Number> = plane.geometry.subGeometries[0].vertexData; var outputlist:Vector.<Number> = new Vector.<Number>(vertexlist.length-1); // changed here
plane.sceneTransform.transformVectors(vertexlist, outputlist); for (var c:Number = 0; c < outputlist.length-2; c+=1)// changed here { va = _view.project(new Vector3D(outputlist[c], 0, outputlist[c + 2])); //changed here va.z = 0; var tmp:Number = Vector3D.distance(va, vb); if (tmp < dst) { dst = tmp; idx = c; } dummy.positi Vector3D(vertexlist[idx],vertexlist[idx+1],vertexlist[idx+2]); } Thank you very much
|