Mouse pick a triangle. How?
Blitz3D Forums/Blitz3D Programming/Mouse pick a triangle. How?
| ||
| I'm trying to work out out the best way to select a triangle on my mesh with a mouse such that when I move my mouse over a mesh and press the mouse button, the nearest triangle under the mouse gets selected and highlighted. Thanks. |
| ||
| See the PickedTriangle() function. |
| ||
try this,
global resetSrf,resetTri,resetNext
global oldR[3],oldG[3],oldB[3],lastTri
function highLight(camera)
local vert[3]
if resetNext or mousedown(1)=false
for j=0 to 2
vert=triangleVertex(resetSrf,resetTri,j)
vertexColor(vert,oldR[j],oldG[j],oldB[j])
next
resetNext=false
endif
if mousedown(1)
hit=camerapick camera,mousex(),mousey()
if hit
tri=pickedTriangle()
if tri=lastTri return
srf=pickedSurface()
for j=0 to 2
vert=triangleVertex(srf,tri,j)
oldR[j]=vertexRed(srf,vert)
oldG[j]=vertexGreen(srf,vert)
oldB[j]=vertexBlue(srf,vert)
if j<2
vertexColor(srf,vert,128+(oldR[j]/2),128+(oldG[j]/2),128+(oldB[j]/2))
else
vertexColor(srf,vert,0,0,0)
endif
next
resetSurf=surf:resetTri=tri:resetNext=true
endif
endif
end function
Not tested, but basically call it once every frame passing your camera to it. Set any entities you want to pick as poly pickable. I.e entityPickMode myMesh,2,true. It'll highlight the current poly, and reset it once the mouse is no longer over it. (Make sure you have the entity using vertex colors. See entityFX) |
| ||
| Neato. How might you select a group of triangles? For instance if you wanted to select all the triangles within a certain radius of one triangle? |
| ||
| The slowest but possibly easiest way to do that is: you would find and save the click spot (x and y), and keep watching current mouse location. Then do something like For x = ClickX to MouseX() For y = ClickY To mouseY() CameraPick camera,x,y Next Next If possible, you could put a Step value in there to speed it up a bit. Note that there is probably an infinietly better box selection script in the code archives |
| ||
| tform verts to camera space and check. |
| ||
| Personally I'd do a normal camera pick, and then just do a spherical distance (I.e squared, otherwise it'll be a diamond formation) of each tri centre to the pick point. That way you'll get true 3d space closeness picking, not just the tris near the mouse on a 2d flat plane(I.e the screen) |
| ||
| Thanks guys. With your help, i've managed to find a solution. |