Ok, I understand. That happens because the camera rotation center is orbiting out of player collision bounds and the trace starts cutting or in the other side of the wall so it does not collide.

You might trace from a 'safe' point inside the player bounds to the hypothetical final position of the camera. But it will shake the whole projection for sure. Hard to be softened. I have not the clue.(not really) You might prevent the player get close to walls grin

edited____________________________

Code:
#include <acknex.h>

#define PRAGMA_PATH "%EXE_DIR%\templates\models"

#define skOffsetX       skill1
#define skOffsetY       skill2
#define skOffsetZ       skill3
#define skDistance      skill4
#define skDistSoft      skill5
#define skDirX          skill6
#define skDirY          skill7
#define skDirZ          skill8
#define skTargetX       skill9
#define skTargetY       skill10
#define skTargetZ       skill11
#define skOriginX       skill12
#define skOriginY       skill13
#define skOriginZ       skill14
#define skCenterX       skill15
#define skCenterY       skill16
#define skCenterZ       skill17

action actCameraCollider () {
	proc_mode = PROC_LATE;
	wait(1);
	my->flags |= INVISIBLE | PASSABLE; 
	my->eflags = FAT | NARROW;
	vec_set(&my->max_x, vector(8, 8, 8));
	vec_set(&my->min_x, vector(-8, -8, -8));
	vec_set(&my->skOriginX, vector(0, -5, 32));
	vec_set(&my->skOffsetX, vector(0, -60, 40));
	my->skDistance = 200;
	my->skDistSoft = my->skDistance;
	my->parent = player;
	while (my->parent == player) {
		my->skDistance = clamp(my->skDistance + mickey.z * 0.3, 20, 400);
		camera->pan = player->pan;
		camera->tilt = clamp(camera->tilt - mickey.y * 0.2, -80, 45);
		vec_set(&my->pan, &player->pan);
		vec_set(&my->x, &my->skOriginX);
		vec_rotate(&my->x, &player->pan);
		vec_add(&my->x, &player->x);
		vec_set(&my->skCenterX, &my->skOffsetX);
		vec_rotate(&my->skCenterX, &player->pan);
		vec_add(&my->skCenterX, &player->x);
		vec_for_angle(&my->skDirX, &camera->pan);
		vec_scale(&my->skDirX, -my->skDistance);
		vec_set(&my->skTargetX, &my->skCenterX);
		vec_add(&my->skTargetX, &my->skDirX);
		you = player;
		var nDist = c_trace(&my->x, &my->skTargetX, IGNORE_YOU | IGNORE_PASSABLE | USE_BOX);
		if (nDist > 0)
			my->skDistSoft += (nDist - my->skDistSoft) * time_step * 2;
		else
			my->skDistSoft += (my->skDistance - my->skDistSoft) * time_step * 2;
		vec_diff(&my->skDirX, &my->skTargetX, &my->x);
		vec_normalize(&my->skDirX, my->skDistSoft);
		vec_set(&camera->x, &my->x);
		vec_add(&camera->x, &my->skDirX);
		wait(1);
	}
	ent_remove(me);
}

#define skPan           skill1
#define skAngle         skill2
#define skMoveX         skill3
#define skMoveY         skill4
#define skMoveZ         skill5

action actPlayer () {
	player = me;
	ent_create(NULL, &my->x, actCameraCollider);
	wait(1);
	my->eflags |= FAT | NARROW;
	vec_set(&my->max_x, vector(16, 16, 32));
	vec_set(&my->min_x, vector(-16, -16, -32));
	my->skPan = 0;
	my->skMoveZ = 0;
	while (me == player) {
		my->skPan = ang(my->skPan - mickey.x * 0.2);
		my->skAngle = ang(my->skPan - my->pan) * time_step * 2; 
		c_rotate(me, vector(my->skAngle, 0, 0), IGNORE_PASSABLE | GLIDE);
		my->skMoveX = key_w - key_s;
		my->skMoveY = key_a - key_d;
		vec_normalize(&my->skMoveX, time_step * 10);
		c_move(me, &my->skMoveX, NULL, IGNORE_PASSABLE | GLIDE);
		wait(1);
	}
	ent_remove(me);
}

void main () {
	video_mode = 10;
	fps_max = 60;
	wait(1);
	level_load("level.wmb");
	camera->clip_near = 1;
	ent_create("player.mdl", vector(100, 100, 32), actPlayer);
	while(!key_esc)
		wait(1);
	player = NULL;
	wait(1);
	sys_exit(NULL);
}


Last edited by txesmi; 02/24/18 11:45.