HowToC:FollowAnObject
From S2PLOT
(Difference between revisions)
Revision as of 23:35, 19 August 2008 Dbarnes (Talk | contribs) (→How to follow an object with the camera) ← Previous diff |
Current revision Dbarnes (Talk | contribs) (→How to follow an object with the camera) |
||
Line 5: | Line 5: | ||
1. use a handle callback to register the most recently selected handle: | 1. use a handle callback to register the most recently selected handle: | ||
<code><pre> | <code><pre> | ||
+ | int camfollow; // initialised to -1 in main | ||
+ | unsigned char *selected; // array storing selected state of all handles | ||
void pickcb(int *id) { | void pickcb(int *id) { | ||
+ | // ... | ||
+ | // toggle state: | ||
+ | selected[*id] = (selected[*id] + 1) % 2; | ||
+ | if (selected[*id]) { | ||
+ | camfollow = *id; | ||
+ | } else { | ||
+ | camfollow = -1; | ||
+ | } | ||
+ | s2togglehandle(*id); | ||
+ | } | ||
+ | </pre></code> | ||
+ | |||
+ | 2. in the standard dynamic callback, set the camera position if required | ||
+ | XYZ *iP; // array storing positions of all handles | ||
+ | <code><pre> | ||
+ | void callback(double *t, int *kc) { | ||
+ | // ... | ||
+ | if (camfollow >= 0) { | ||
+ | // a. fetch current camera position, up and view direction vectors | ||
+ | XYZ position, up, vdir; | ||
+ | ss2qc(&position, &up, &vdir, 1); | ||
+ | // b. calculate new right vector | ||
+ | XYZ vright = CrossProduct(vdir, up); | ||
+ | // c. calculate new view direction vector | ||
+ | vdir = VectorSub(position, iP[camfollow]); | ||
+ | Normalise(&vdir); | ||
+ | // d. calculate new up vector and set new camera position | ||
+ | up = CrossProduct(vright, vdir); | ||
+ | ss2sc(position, up, vdir, 1); | ||
+ | } | ||
+ | // ... | ||
} | } | ||
</pre></code> | </pre></code> |
Current revision
[edit]
How to follow an object with the camera
Using handles, you can easily detect when an object has been right-clicked. With two pretty simple bits of code, you can then make the camera keep focussed on that object.
1. use a handle callback to register the most recently selected handle:
int camfollow; // initialised to -1 in main
unsigned char *selected; // array storing selected state of all handles
void pickcb(int *id) {
// ...
// toggle state:
selected[*id] = (selected[*id] + 1) % 2;
if (selected[*id]) {
camfollow = *id;
} else {
camfollow = -1;
}
s2togglehandle(*id);
}
2. in the standard dynamic callback, set the camera position if required XYZ *iP; // array storing positions of all handles
void callback(double *t, int *kc) {
// ...
if (camfollow >= 0) {
// a. fetch current camera position, up and view direction vectors
XYZ position, up, vdir;
ss2qc(&position, &up, &vdir, 1);
// b. calculate new right vector
XYZ vright = CrossProduct(vdir, up);
// c. calculate new view direction vector
vdir = VectorSub(position, iP[camfollow]);
Normalise(&vdir);
// d. calculate new up vector and set new camera position
up = CrossProduct(vright, vdir);
ss2sc(position, up, vdir, 1);
}
// ...
}