• Announcements

    • khawk

      Download the Game Design and Indie Game Marketing Freebook   07/19/17

      GameDev.net and CRC Press have teamed up to bring a free ebook of content curated from top titles published by CRC Press. The freebook, Practices of Game Design & Indie Game Marketing, includes chapters from The Art of Game Design: A Book of Lenses, A Practical Guide to Indie Game Marketing, and An Architectural Approach to Level Design. The GameDev.net FreeBook is relevant to game designers, developers, and those interested in learning more about the challenges in game development. We know game development can be a tough discipline and business, so we picked several chapters from CRC Press titles that we thought would be of interest to you, the GameDev.net audience, in your journey to design, develop, and market your next game. The free ebook is available through CRC Press by clicking here. The Curated Books The Art of Game Design: A Book of Lenses, Second Edition, by Jesse Schell Presents 100+ sets of questions, or different lenses, for viewing a game’s design, encompassing diverse fields such as psychology, architecture, music, film, software engineering, theme park design, mathematics, anthropology, and more. Written by one of the world's top game designers, this book describes the deepest and most fundamental principles of game design, demonstrating how tactics used in board, card, and athletic games also work in video games. It provides practical instruction on creating world-class games that will be played again and again. View it here. A Practical Guide to Indie Game Marketing, by Joel Dreskin Marketing is an essential but too frequently overlooked or minimized component of the release plan for indie games. A Practical Guide to Indie Game Marketing provides you with the tools needed to build visibility and sell your indie games. With special focus on those developers with small budgets and limited staff and resources, this book is packed with tangible recommendations and techniques that you can put to use immediately. As a seasoned professional of the indie game arena, author Joel Dreskin gives you insight into practical, real-world experiences of marketing numerous successful games and also provides stories of the failures. View it here. An Architectural Approach to Level Design This is one of the first books to integrate architectural and spatial design theory with the field of level design. The book presents architectural techniques and theories for level designers to use in their own work. It connects architecture and level design in different ways that address the practical elements of how designers construct space and the experiential elements of how and why humans interact with this space. Throughout the text, readers learn skills for spatial layout, evoking emotion through gamespaces, and creating better levels through architectural theory. View it here. Learn more and download the ebook by clicking here. Did you know? GameDev.net and CRC Press also recently teamed up to bring GDNet+ Members up to a 20% discount on all CRC Press books. Learn more about this and other benefits here.
Sign in to follow this  
Followers 0
Silverlan

[PhysX] Move controller + getting its velocity

4 posts in this topic

I'm trying to use a PxController for my player character, but I'm having a bit of trouble.

This is how I'm creating the controller:

local mat = physx.CreateMaterial(0.5,0.5,0.1)
local controller = physx.CreateCapsuleController({
	height = 64,
	radius = 18,
	material = mat,
	contactOffset = 0.01
})
local actor = controller:GetActor()

The code snippets are in lua, but all these functions do internally is call the equivalent physx-functions.

After the controller has been created, it's being moved every time the world is simulated:

local dir = Vector(math.sin(CurTime()),0,math.cos(CurTime())) -- Move the controller in a circle; CurTime() is the time that has passed since the program start
dir = dir *10
local disp = dir *DeltaTime() -- DeltaTime() = time since last world simulation
controller:Move(
	disp,
	0.01,
	DeltaTime()
)
local vel = actor:GetLinearVelocity()
local speed = vel:Length()
print(math.abs(speed -dir:Length())) -- Should be 0, but fluctuates quite a bit

The actual movement works as intended. If I compare the new position, after the whole PxScene was simulated, to the old position (before the "Move"-Call), the difference is exactly the displacement vector.

The velocity, however, is behaving strangely. The way I see it, getLinearVelocity should return the same as the displacement vector, but there's a small, random, deviation, but it's too large to be a precision error of some sort. What am I missing?

 

One more thing:

I can move the controller in any direction, even upwards from the ground. How would I actually restrict the movement so the controller actually sticks to the ground? And what exactly is the point of the 'setUpDirection'-function for PxControllers if it doesn't already do that?

0

Share this post


Link to post
Share on other sites

You can't rely on the actor's velocity in this case... The character controller framework does so much more under the hood. You should track the velocity manually. Using that "dir" in your code should be perfectly fine (e: unless the controller touches something - you have to check for these conditions).

 

One way to handle the gravity is to manually apply the acceleration. The cc framework provides the raycast result flags. If the bottom of the cc touches ground (or something else), just reset the velocity's z-component or modify it according to conservation laws. The up direction is used to do these raycasts and to determine the orientation of the cc shape.

Edited by fanwars
2

Share this post


Link to post
Share on other sites

Thanks for the response, it's hard to get help with anything PhysX related.

 

Anyway, I'm unsure how I'm supposed to track the velocity myself accurately. As you've said, as long as there's no collisions it would probably be fine, but if there is a collision that's a whole different story.

The flags I get from the 'Move'-Call only tell me whether there was a collision above / below / to one of the sides of the controller, I need more information about the collision than that. And even then I'd have to know exactly how physx does the collision response (e.g. sliding against a wall) to calculate the new exact velocity.

 

Also, if the difference between the new position and the old position is exactly my displacement vector, how is it possible that getLinearVelocity returns something else? I mean, even if the controller framework does some additional calculations, the velocity should be exactly the vector by which it has moved, should it not?

0

Share this post


Link to post
Share on other sites

Internally the controller framework uses setKinematicTarget() so one can only guess what PhysX does beyond that point. I don't know if it's even valid to use getLinearVelocity with kinematic actors...

 

However, since the displacement is accurate, why not use it to calculate the velocity yourself? Just keep the previous and current position between updates and divide the displacement with your timestep.

2

Share this post


Link to post
Share on other sites

It just seems to me more like a workaround than an actual solution, but I guess it will do, thanks. The only problem I see is that I can't differentiate whether the actor has been forcibly teleported to a specific position, or moved there regularly, but I guess I'll have to live with that. Thanks again!

0

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!


Register a new account

Sign in

Already have an account? Sign in here.


Sign In Now
Sign in to follow this  
Followers 0