Search the Community
Showing results for tags 'Pick'.
The search index is currently processing. Current results may not be complete.
-
In this tutorial will be used Tile, Camera:Pick() and Entity:GetDistance FPSPlayer component of FPS Template will be used as a base to modify Algorithm: 1. Create a Tile with text prompt 2. In Update function of component check if player look at usable object at close distance 3. if the check is passed then show prompt at center of screen Result will looks like that: Let's implement this Algorithm: 1. Add new component variable, for example after: FPSPlayer.movement = Vec3(0) New code line: FPSPlayer.usePromtTile = nil Now in FPSPlayer:Load() function after: if not self.camera then self.camera = CreateCamera(world) self.camera:Listen() Add: local font = LoadFont("Fonts/arial.ttf") self.usePromtTile = CreateTile(self.camera, font, "Press E", 20, TEXT_CENTER, 1.5) This overload used (more short one for text currently not available when tutorial is written): CreateTile(Camera camera, Font font, string text, number fontsize, number alignment, number linespacing) Tile is something like mini GUI widget which can be used to show text or rectangles without creating Interface. 2 and 3. Inside of FPSPlayer:Update() in "if window then" scope before its end (after 392th line) add: --to decide later if we want to show or hide prompt tile local doHideTile = true --cx and cy are screen center coordinates which were created above local pickInfo = self.camera:Pick(framebuffer, cx, cy, 0, true) if pickInfo.success and pickInfo.entity and pickInfo.entity:GetDistance(self.entity) < 2.0 then --iterate all components of picked entity for _, component in ipairs(pickInfo.entity.components) do --find out if component of picked entity have Use function and it's enabled if component.Use and type(component.Use) == "function" and component:GetEnabled() then --move tile to center of screen self.usePromtTile:SetPosition(cx, cy) doHideTile = false --stop iterating once we found usable object break end end end self.usePromtTile:SetHidden(doHideTile) Result file: FPSPlayer.lua
-
If brush was SetParented to a pivot World::Pick() starts ignoring it. How it should be: How it is: #include "UltraEngine.h" using namespace UltraEngine; bool PickFilter(std::shared_ptr<Entity> entity, std::shared_ptr<Object> extra) { if (entity->GetCollider() == nullptr) { return false; } return true; } int main(int argc, const char* argv[]) { auto displays = GetDisplays(); auto window = CreateWindow("Ultra Engine", 0, 0, 1280, 720, displays[0], WINDOW_CENTER | WINDOW_TITLEBAR); auto world = CreateWorld(); auto framebuffer = CreateFramebuffer(window); auto camera = CreateCamera(world); camera->SetClearColor(0.125); camera->SetFov(70); camera->SetPosition(0, 2, -3); camera->SetRotation(25, 0, 0); camera->SetDebugPhysicsMode(true); auto light = CreateDirectionalLight(world); light->SetRotation(35, 45, 0); light->SetColor(1); auto floor = CreatePlane(world, 100, 100); floor->Move(0, -1, 0); auto b1 = CreateBox(world, 2.0f); b1->SetPosition(-3.0f, 0.0f, 0.0f); b1->SetColor(1, 0, 0); auto pivotParent = CreatePivot(world);//added a parent here b1->SetParent(pivotParent); auto b2 = CreateBox(world, 2.0f); b2->SetColor(0.0f, 0.0f, 1.0f); b2->SetPosition(3.0f, 0.0f, 2.0f); b2->SetRotation(0.0f, 45.0f, 0.0f); auto pivot = CreatePivot(world); auto rod_scale = 5.0f; auto rod = CreateCylinder(world, 0.05f); rod->SetCollider(nullptr); rod->SetParent(pivot); rod->SetRotation(90.0f, 0.0f, 0.0f); rod->SetPosition(0.0f, 0.0f, rod_scale / 2.0f); rod->SetScale(1.0f, rod_scale, 1.0f); auto sphere = CreateSphere(world, 0.25f); sphere->SetCollider(nullptr); sphere->SetParent(pivot); sphere->SetColor(0, 1, 0); sphere->SetPosition(0.0f, 0.0f, rod_scale); auto spin_speed = 0.5f; while (window->Closed() == false and window->KeyDown(KEY_ESCAPE) == false) { pivot->Turn(0.0f, spin_speed, 0.0f); auto target_pos = Vec3(0.0f, 0.0f, rod_scale); target_pos = TransformPoint(target_pos, Mat4(), pivot->GetMatrix(true).Inverse()); // Perform a ray cast auto pick_info = world->Pick(pivot->GetPosition(true), target_pos, 0.25f, true, PickFilter); if (pick_info.success) { sphere->SetPosition(pick_info.position, true); } else { sphere->SetPosition(target_pos, true); } world->Update(); world->Render(framebuffer); } return 0; }
-
if window:MouseHit(1) then local pickinfo= PickInfo() local p1 = Window:GetCurrent():GetMousePosition() --local box = Model:Box() if (self.camera:Pick(p1.x,p1.y,pickinfo,0.5,true)) then if pickinfo.entity then if pickinfo.entity:GetKeyValue("Button")~="" then --box:SetScale(0.2,0.2,0.2) --box:SetPosition(pickinfo.entity:GetPosition(true),true) System:Print(tostring(pickinfo.entity:GetKeyValue("Button"))) end end end end the above is the camera pick , I cant find anything . The camera pick should Print the Key value of the box in the script below. However, it prints nothing and I dont know why. Script.localKeyValue = -1--string " Key Value Integer" function Script:Start() self.entity:SetKeyValue("Button",self.localKeyValue) end
- 1 reply
-
- GetKeyValue
- Camera
-
(and 1 more)
Tagged with:
-
I have a third person character controller, the character has pickmode(0). I can walk around and have obstacles between the player and the cam , but nothing happens? the self.pivot is a pivot which is at the center of the character (the camera focus). updateworld: if self.entity.world:Pick(self.pivot:GetPosition(),self.camera:GetPosition(),pickinfo,0,true) then local model2 = Model:Box() model2:SetPickMode(0) model2:SetPosition(pickinfo.position) model2:SetColor(0,1,0) System:Print(">> PICKED") --self.camera:SetPosition(pickinfo.position) end
- 3 replies
-
- Third Person
- Pick
-
(and 2 more)
Tagged with: