Arkane Posted September 10, 2014 Posted September 10, 2014 Hi, I'm testing Thid Person Camera. I have searched for tutorial on the forum . My camera is based on Aggror tutorial but I don't know how to handle camera collision to avoid seeing through walls. I know there are differents solutions to handle that (camera sphere, raycast, ...) : http://www.gamasutra.com/blogs/EricUndersander/20131001/201382/Accurate_Collision_Zoom_for_Cameras.php or http://books.google.fr/books?id=az_Oi9mSSiIC&pg=PA681&lpg=PA681&dq=third+person+camera+collision+sphere&source=bl&ots=CDTY7nJpfL&sig=sDnRf4DgJkJg39vSmNwI8vJlQ2U&hl=fr&sa=X&ei=gxAOVMOrAY2Xar_tgNAF&ved=0CCoQ6AEwATgK#v=onepage&q=third%20person%20camera%20collision%20sphere&f=false What's the best method ? Can someone help me posting code to show me how to handle that problem ? Thanks ! Quote
cassius Posted September 10, 2014 Posted September 10, 2014 Its the player that collides not the camera.Agggror creates a pivot for the player. This is what collides with stuff. I am referring to the Aggror c++ tutorial. Quote amd quad core 4 ghz / geforce 660 ti 2gb / win 10 Blender,gimp,silo2,ac3d,,audacity,Hexagon / using c++
cassius Posted September 10, 2014 Posted September 10, 2014 If you meant how to avoid camera becoming unsighted behind walls then raycasting is one answer and Aggrors c++ tutorial has an example. Quote amd quad core 4 ghz / geforce 660 ti 2gb / win 10 Blender,gimp,silo2,ac3d,,audacity,Hexagon / using c++
tjheldna Posted September 10, 2014 Posted September 10, 2014 Here is a snippet from my third person camera code, pretty sure I derived it from Aggrors Tut (can't remember). Obviously a lot of the variables are declared somewhere else the section you are after is the Pick. Note you need to set the characters pick mode to 0 else the pick will hit the model and wont work. GetCameraTarget() returns an entity that the camera is tracking Let me know if you have any questions void ChaseCamera::Update(void) { BaseCamera::Update(); if (GetCameraTarget()) { Vec3 lastPosition; Vec3 lastRotation; BaseObject* object = (BaseObject*)GetCameraTarget()->GetUserData(); //Calculate the furthest TPS pivot position tpsPivot->SetPosition(GetCameraTarget()->GetPosition()); Vec3 pickPos = GetCameraTarget()->GetPosition(); pickPos.y += GetHeight(); Vec3 rot = tpsPivot->GetRotation(); Vec3 pos = tpsPivot->GetPosition(); pos.y += GetHeight(); tpsPivot->SetPosition(pos); rot.y = -characterYaw; rot.x = -characterPitch; tpsPivot->SetRotation(rot); entity->Point(tpsPivot); tpsPivot->Move(0.0, GetHeight(), -GetCamDistance(), false); //Use a pick to determine where the camera should be PickInfo pick; GetCameraTarget()->SetPickMode(0); if (World::GetCurrent()->Pick(pickPos, tpsPivot->GetPosition(), pick, 0.0F, true)) tpsPivot->SetPosition(pick.position); GetCameraTarget()->SetPickMode(Entity::SpherePick); //Apply position lastPosition.x = Math::Curve(tpsPivot->GetPosition().x, entity->GetPosition().x, (GetSmoothness()) / Time::GetSpeed()); lastPosition.y = Math::Curve(tpsPivot->GetPosition().y, entity->GetPosition().y, (GetSmoothness()) / Time::GetSpeed()); lastPosition.z = Math::Curve(tpsPivot->GetPosition().z, entity->GetPosition().z, (GetSmoothness()) / Time::GetSpeed()); entity->SetPosition(lastPosition); } } Quote
Arkane Posted September 11, 2014 Author Posted September 11, 2014 Thank your for your answers. I will try to implement similar thing in my TPS camera code (when I'll be back home after work). I'll let you know if it works ;-). Quote
Arkane Posted September 11, 2014 Author Posted September 11, 2014 So I found a workaround to handle my camera and not see through walls when I'm in a house for example. I've changed the pick radius and it works. After I will try to improve my camera rotation around the player. Based on Aggrors tutorial : //Update camera position Vec3 playerPosition = player->GetPosition(); Vec3 cameraPosition = fpsPivot->GetPosition(); float cameraHeight = crouching ? crouchHeight : playerHeight; cameraPosition.y = Math::Curve(playerPosition.y + cameraHeight, cameraPosition.y, cameraSmoothing); cameraPosition = Vec3(playerPosition.x, cameraPosition.y, playerPosition.z); fpsPivot->SetPosition(cameraPosition); //Position and rotation of FPS camera camera->SetPosition(fpsPivot->GetPosition()); //Postion and rotation of TPS camera tpsPivot->SetPosition(fpsPivot->GetPosition()); tpsPivot->Move(0, 1, maxCameraOffset); //Checking if Space key is pressed if (window->KeyHit(Key::Space)) { isFpsCam = !isFpsCam; } // Checking camera mode if (isFpsCam) { camera->SetPosition(fpsPivot->GetPosition()); camera->SetRotation(fpsPivot->GetRotation()); } else { camera->SetRotation(fpsPivot->GetRotation()); camera->SetPosition(tpsPivot->GetPosition()); } //Raycast to check TPS Camera obstacle PickInfo pick; if (world->Pick(fpsPivot->GetPosition(), tpsPivot->GetPosition(), pick, 0.5, true) && !isFpsCam) { camera->SetPosition(pick.position); } You can adjust pick radius a bit to have a better behaviour. Quote
cassius Posted September 11, 2014 Posted September 11, 2014 Well done arkane. Good luck. Quote amd quad core 4 ghz / geforce 660 ti 2gb / win 10 Blender,gimp,silo2,ac3d,,audacity,Hexagon / using c++
Arkane Posted September 16, 2014 Author Posted September 16, 2014 I've found a good tutorial about TP camera collision/occlusion. It's for Unity but I think we can make the same in leadwerks. http://www.3dbuzz.com/training/view/3rd-person-character-system/enhanced-character-system/11-occlusion-and-collision-overview There is more videos about third person camera here : http://www.3dbuzz.com/training/view/3rd-person-character-system/enhanced-character-system Can someone tell me if it is possible to port it to leadwerks ? Thanks! Quote
Arkane Posted September 17, 2014 Author Posted September 17, 2014 I saw in camera.h that there is localfrustumpoints and frustumpoints. What is the difference ? What if the order of each point in those arrays ? Can I use them to get the near camera plane and the far camera plane of the view frustrum ? Maybe is it easier to use Camera::GetRange() and Camera::GetFOV () then calculate the four points of the near camera plane ? Quote
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.