Also, the deformation is noticeable mainly because the dimensions of the bitmap that I'm using for the terrain mesh are not square (i.e. 100 x 100). They're more like 240 x 380 for a variety of reasons.
Ari On Sep 2, 9:23 pm, Ari Braginsky <[EMAIL PROTECTED]> wrote: > Perhaps there is some sort of formula that could be applied to the 2D > coordinate on the mesh such that similar to "undoing" the terrain > scaling to get the corresponding 2D bitmap coordinate by X and Y by > the terrain scaling factores, you can "undo" the subdivision by some > procedure? > > This is ultimately what I need to solve this problem... > > Ari > > On Sep 2, 8:18 pm, Ari Braginsky <[EMAIL PROTECTED]> wrote: > > > Li, > > > Thank you for your post. I'm not sure if your solution is the same as > > the solution that I need for my problem. > > > To clarify, I'm moving a point around on a mesh that has a bitmap > > image inside of it. When I move that point, I need to track the > > relative position of that point on the bitmap in normal 2D space in > > order to measure the pixel color value at that point. > > > Because of the subdivision values, the bitmap image inside of the mesh > > is deformed such that when your point is on top of a feature in the > > bitmap mesh, it doesn't exactly line up with the same converted (by > > way of the mesh X and Y scale division method) point on the 2D > > bitmap. It is somewhat off. > > > I need to be able to adjust for the subdivision distortion. > > > Is this similar to your problem that was solved with your solution? > > > Thanks, > > Ari > > > On Sep 2, 8:06 pm, Li <[EMAIL PROTECTED]> wrote: > > > > Hey Ari, > > > > Ive been working with a similar issue in reflections. The solution I used > > > might be useful to you. The particular problem I had was, once I obtained > > > a > > > 3d point that I knew was on the surface of a plane, what would be the 2d > > > coordinates of that point on the plane? The solution involved determining > > > the top side and left side vectors of the plane, obtaining a vector from > > > the > > > top left corner of the plane to the 3d point, and then using dot products > > > to > > > project that vector onto the side vector. That gives you a scalar value > > > that > > > corresponds to the coordinate system transformation of the point. > > > > If you think it might help you, here is the code: > > > > //Three vertices. > > > edgePoint = getVertexGlobalPosition(plane.vertices[0], > > > plane); > > > var p2:Number3D = > > > getVertexGlobalPosition(plane.vertices[1], > > > plane); > > > var p3:Number3D = > > > getVertexGlobalPosition(plane.vertices[4], > > > plane); > > > > //Side vectors. > > > topVector = new Number3D(); > > > topVector.sub(p2, edgePoint); > > > sideVector = new Number3D(); > > > sideVector.sub(p3, edgePoint); > > > > wRatio = MovieMaterial(plane.material).movie.width/plane.width; > > > hRatio = > > > MovieMaterial(plane.material).movie.height/plane.height; > > > > //TRANSLATE GLOBAL TO PLANE. > > > //Translates a world 3D point to a corresponding 2D point > > > on > > > the plane's material. > > > private function > > > translateGlobalToPlane(point:Number3D):Point > > > { > > > /* > > > Finds a vector from one of the corners of the > > > plane > > > to the point, > > > and projects this vector on its sides, considering > > > scaling. > > > */ > > > var v:Number3D = new Number3D(); > > > v.sub(point, edgePoint); > > > return new > > > Point(wRatio*v.dot(topVector)/topVector.modulo, hRatio*(this.height - > > > v.dot(sideVector)/sideVector.modulo)); > > > } > > > > //GET VERTEX GLOBAL POSITION. > > > //Translates vertex coordinates to world coordinates. > > > private function getVertexGlobalPosition(vertex:Vertex, > > > vertexContainer:Object3D):Number3D > > > { > > > var m:Matrix3D = new Matrix3D(); > > > m.tx = vertex.x; > > > m.ty = vertex.y; > > > m.tz = vertex.z; > > > m.multiply(vertexContainer.transform, m); > > > return new Number3D(m.tx, m.ty, m.tz); > > > } > > > > On Tue, Sep 2, 2008 at 9:34 PM, Ari Braginsky <[EMAIL PROTECTED]> wrote: > > > > > I'm having an issue retrieving 2D coordinates off of a mesh based on a > > > > 3D object's position on the mesh. > > > > > You can normally retrieve the 2D coordinates on the bitmap making up > > > > the mesh by dividing the coordinates of the object by the mesh's X and > > > > Y scale values (see extrusions/CollisionMap.as class). > > > > > However, if you look at the position on the mesh and compare it to the > > > > raw bitmap, due to some deformations that happen to the mesh with > > > > certain subdivision values, the objects that appear in the bitmap > > > > don't line up with the 2D coordinates on the raw bitmap. If you tweak > > > > the subdivision values, the objects on the bitmap in the mesh move > > > > around/get squashed/etc. > > > > > Example: > > > > > Create a bitmap with a circle in the center filled with the color red. > > > > > Create an elevation using a flat height map and use the bitmap for its > > > > skin. > > > > > When rendered in 3D, you will see the red circle in the center of the > > > > mesh. If you move your mouse over it, you can translate the 3D > > > > coordinates into 2D space and divide them by the mesh's X and Y scale > > > > values to get the real coordinates on the raw bitmap. > > > > > What I'm seeing with subdivision values X = 200 and y = 200 is that my > > > > point on the mesh doesn't correlate to the same point on the 2D bitmap > > > > when I convert the 3D coordinates to 2D, taking into account the mesh > > > > scale values. > > > > > Is there something else I need to do to account for the subdivision > > > > values? > > > > > If I didn't want any deformation of the mesh, are there subdivision > > > > values I can use such that 3D points on the mesh would exactly match > > > > up with 2D points on the associated bitmap? > > > > > Thanks, > > > > Ari