I’ve only done this when the new area opens with a cutscene, but I imagine the same applies to a transition into normal gameplay.
In the area OnEnter event, the PC’s new location is not yet defined. So, I use DelayCommand and ExecuteScript to run the camera script 2 seconds later. That way, the camera script can rely on the PC’s new location as a basis for the camera position. This also ensures that the camera script overrides the default camera position set by the engine on entry.
In my experience, 2 seconds is long enough to work reliably, but short enough for an immediate transition to the new camera position, without seeing the default first.
The nwscript camera functions work fine, but I have to say that life is much easier with the Gestalt cutscene package (well worth the learning curve). You might consider starting a cutscene to position the camera, then stopping it, using the option to conserve the camera position.
I find myself using GestaltCameraCrane all the time, even when I don’t want the camera to move, as it’s the most general function, which works fine, even if position1 and position 2 are identical.
I should emphasise that if you do use the Gestalt functions, they need to be issued by the camera script 2 seconds after OnEnter. If you issue them directly from the OnEnter script, using the Gestalt delay capability, you will run into the position anomaly mentioned above.
I’m not sure, but you might also be able to overcome the timing issue by setting the camera position in a trigger on arrival, rather than on area entry. However, you’d have to paint a lot of triggers if you wanted that to happen everywhere!