}
void forwardOnSurface(float factor) {
double viewerdistance = viewer.length();
Point3D v1 = viewer;
forward(factor);
// keep distance
Point3D v2 = viewer;
viewer = viewer.normalize().multiply(viewerdistance);
// rotate forward and up
// double alpha = acos((v2-v1).length()/(viewer-v1).length());
Point3D v1n = v1.normalize();
double alpha = Math.acos(viewer.normalize().skalarproduct(v1n));
Point3D r = (v2.minus(v1)).crossproduct(v2);
float matrix[] = new float[16];
Quaternion quat = new Quaternion();
Point3D norm = r.normalize();
quat.createFromAxisAngle((float) norm.x, (float) norm.y, (float) norm.z, (float) alpha);
quat.createMatrix(matrix);
Matrix mMatrix = new Matrix(matrix);