To implement and exercise the camera
object, moving
object_find_closest
to model object
- (id) init;
- (void) read: (FILE *) _file;
- (void) write: (FILE *) _file;
for the camera_t
object:
@interface camera_t: NSObject // Class: Parent
{
int cookie;
NSString *name;
int pixel_dim[2];
double world_dim[2];
vec_t *view_point;
}
@interface model_t: NSObject // Class: Parent
{
camera_t *cam;
list_t *mats;
list_t *objs;
}
model_t
object implements the searching
@protocol
:
@protocol searching
- (object_t *) find_closest: (vec_t *) pos: (vec_t *) dir:
(double *) dis:
(vec_t **) hit: (vec_t **) N;
@end
main.m
routine works unaltered:
#import <Foundation/Foundation.h>
#import <stdio.h>
#import <stdlib.h>
#import <string.h>
#import <assert.h>
#import <math.h>
#import <vector.h>
#import <pixel.h>
#import <list.h>
#import <camera.h>
#import <material.h>
#import <object.h>
#import <plane.h>
#import <model.h>
//---- prototypes ----
int main(int argc, const char *argv[]);
//---- program section ----
int main(int argc, const char *argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
model_t *model = [(model_t *)[model_t alloc] init];
FILE *model_file=NULL, *hits_file=NULL;
vec_t *pos = [(vec_t *)[vec_t alloc] init: 4.0: 3.0: 5.0];
vec_t *dir = [(vec_t *)[vec_t alloc] init: 0.0: 0.0: -1.0];
vec_t *hit = [(vec_t *)[vec_t alloc] init];
vec_t *N = [(vec_t *)[vec_t alloc] init];
double dis = 0.0;
object_t *obj = nil;
NSLog(@"main start");
NSLog(@"reading stdin");
if(argc != 3) {
fprintf(stderr,"Usage: %s \n",argv[0]);
exit(1);
}
// open model file
if((model_file = fopen(argv[1],"r")) == NULL) {
printf("Error opening input file: %s\n",argv[1]);
return;
}
[model read: model_file];
fclose(model_file);
[model write: stdout];
// open hits file
if((hits_file = fopen(argv[2],"r")) == NULL) {
printf("Error opening input file: %s\n",argv[2]);
return;
}
while([dir read: hits_file]) {
dir = [dir unit];
[dir write: stderr: "Ray direction:"];
dis = 0.0;
obj = [model find_closest: pos: dir: &dis: &hit: &N];
if(dis > 0) {
fprintf(stderr,"Hit: %-12s ",[[obj getname] UTF8String]);
fprintf(stderr,"Dist = %8.3lf ",dis);
[[obj getlast_hit] write: stderr: "Loc = "];
} else
fprintf(stderr,"Dist = %8.3lf \n", dis);
fprintf(stderr, "\n\n");
obj = [model find_closest: pos: dir: &dis: &hit: &N];
if(dis > 0) {
fprintf(stderr,"Hit: %-12s ",[[obj getname] UTF8String]);
fprintf(stderr,"Dist = %8.3lf ",dis);
[[obj getlast_hit] write: stderr: "Loc = "];
} else
fprintf(stderr,"Dist = %8.3lf \n", dis);
}
fclose(hits_file);
[pool drain];
return 0;
}
camera cam1 { pixeldim 640 480 worlddim 8 6 viewpoint 4 3 6 } material green { ambient 0 5 0 } material yellow { ambient 5 4 0 diffuse 4 4 0 specular 1 1 1 } plane leftwall { material green normal 3 0 1 point 0 0 0 } plane rightwall { material yellow normal -3 0 1 point 8 0 0 } material gray { ambient 2 2 2 } plane floor { material gray normal 0 1 0 point 0 -0.2 0 }
-0.5 -0.1 -1 0.5 -0.1 -1 0 -0.5 -1.0 1 1 1
2013-02-12 11:51:32.078 main[60168:903] main start 2013-02-12 11:51:32.080 main[60168:903] reading stdin camera cam1 { pixeldim 640 480 worlddim 8 6 viewpoint 4.000 3.000 6.000 } material green { ambient 0 5 0 } material yellow { ambient 5 4 0 diffuse 4 4 0 specular 1 1 1 } material gray { ambient 2 2 2 } plane leftwall { material green normal 3.000 0.000 1.000 point 0.000 0.000 0.000 } plane rightwall { material yellow normal -3.000 0.000 1.000 point 8.000 0.000 0.000 } plane floor { material gray normal 0.000 1.000 0.000 point 0.000 -0.200 0.000 } Ray direction: -0.445 -0.089 -0.891 Hit: leftwall Dist = 7.633 Loc = 0.600 2.320 -1.800 Hit: leftwall Dist = 15.266 Loc = 0.600 2.320 -1.800 Ray direction: 0.445 -0.089 -0.891 Hit: rightwall Dist = 7.633 Loc = 7.400 2.320 -1.800 Hit: rightwall Dist = 15.266 Loc = 7.400 2.320 -1.800 Ray direction: 0.000 -0.447 -0.894 Hit: floor Dist = 7.155 Loc = 4.000 -0.200 -1.400 Hit: floor Dist = 14.311 Loc = 4.000 -0.200 -1.400 Ray direction: 0.577 0.577 0.577 Dist = 0.000 Dist = 0.000
tar.gz
archive of your asg6/ directory, including:
README
file containing
Makefile
.h
headers and .c
source)
make clean
before tar
)
submit
notes.