We get it. We use ad blockers too. But GameDev.net displays them so we can continue to be a great platform for you.
Please whitelist GameDev.net and our advertisers.
Also consider a GDNet+ Pro subscription to remove all ads from GameDev.net.
Subscribe to GameDev.net's newsletters to receive the latest updates and exclusive content.
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.
Posted 09 October 2012 - 11:12 PM
Posted 09 October 2012 - 11:56 PM
I could write the algorithm to do this myself if I took the time to work it out, but I wanted to see if someone else has done it first.
I'm working on a voxel engine for a game that I'm working on, and I need to trace a ray from the camera's position out a certain distance to try to find the nearest intersection. I was thinking of just taking the cell that the camera is in, then taking the direction, figuring out at what point the ray leaves the cell, then figure out what the next cell is that it will enter. I would keep doing this until I find an intersection.
Does anyone have experience with this? Maybe you have an algorithm that can do just that?
CurrentCell = GetCell(Ray.Start); //we start in the current cell EndCell = GetCell(Ray.End); //we mark the last cell so we know where to stop. while(CurrentCell!=EndCell){ //we only need to check at most 3 faces depending on the direction of the ray(since we obviously can't hit faces we're not heading towards) Vector3 Result; //Store ray point. int Faces[3]; Faces[0] = Ray.Direction.x<0.0f?LEFT:(Ray.Direction.x>0.0f?Right:-1); //if direction.x == 0 then no need to test the face; Faces[1] = Ray.Direction.y<0.0f?BOTTOM:(Ray.Direction.y>0.0f?TOP:-1); //" " Faces[2] = Ray.Direction.z<0.0f?BACK:(Ray.Drection.z>0.0f?FRONT:-1); //" " for(int i=0;i<3;i++){ if(Faces[i]==-1) continue; if(CheckPlanexRay(CurrentCell.VoxelPlane[Faces[i]], Ray, &Result)){ //we need the point that intersects this cell. if(CurrentCell.CheckPointInVoxel(Result)){ CurrentCell = CurrentCell.GetNeighbor(Faces[i]); if(CurrentCell.isClosed()) return Result, CurrentCell;. break; } } } return null; }
Edited by slicer4ever, 09 October 2012 - 11:59 PM.
Posted 10 October 2012 - 01:59 AM
Posted 10 October 2012 - 05:39 AM
For simplicity, since my voxels are 1x1x1 in size, I decided I could just move the ray by 1 unit, then get the cell that the ray is in, then check collision within that cell. Then I just keep incrementing it until I either reach my max length, or I find collision. Now I just need to remember how to collide a 3D ray with a 3D quad.
Posted 11 October 2012 - 12:56 AM
Posted 11 October 2012 - 01:09 AM
Edited by luca-deltodesco, 11 October 2012 - 01:10 AM.
Posted 11 October 2012 - 01:26 AM
You should really just look up the DDA algorithm as previously suggested, it is 'far' simpler implementation than what you have described.
int sign = Math.Sign(direction) float distance; if(sign == 1) { distance = 1 - value; } else if(sign == -1) { distance = -value; } else { distance = infinity; }
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.
GameDev.net™, the GameDev.net logo, and GDNet™ are trademarks of GameDev.net, LLC.