def pose(f, rot): global FRAME # Calculate the piston's rotation. # First find the real position of the piston hinge. hinge_pos = Vec(-43, 0, 10.5) hinge_pos.x -= 64 hinge_pos.rotate(float(rot), 0, 0) hinge_pos.x += 64 # Where we want the end of the piston to be. anchor_point = Vec(z=-96, x=rot*1.5 + 96) piston_off = hinge_pos - anchor_point print(piston_off) piston_rot = math.degrees(math.atan2(piston_off.z, -piston_off.x)) f.write(frame_temp.format( time=FRAME, rot=-round(math.radians(rot), 6), # Cancel the effect of rot on pist_rot pist_rot=round(math.radians((piston_rot + rot) % 360), 6), len=-piston_off.mag(), marker=Vec(z=anchor_point.z, y=-anchor_point.x), )) FRAME += 1
def res_camera(vmf: VMF, inst: Entity, res: Property): """Result for the camera item. Options: - cam_off: The position that the camera yaws around. - yaw_off: The offset from cam_off that the camera rotates up/down. - pitch_off: The offset from yaw_off that is where the sensor is. - yaw_inst: The instance to place for the yaw rotation. - pitch_inst: The instance to place for the up/down rotation. - yaw_range: How many degrees can the camera rotate from a forward position? - pitch_range: How many degrees can the camera rotate up/down? """ conf = res.value normal = Vec(0, 0, 1).rotate_by_str(inst['angles']) if normal.z != 0: # Can't be on floor/ceiling! inst.remove() return base_yaw = math.degrees(math.atan2(normal.y, normal.x)) % 360 inst['angles'] = '0 {:g} 0'.format(base_yaw) base_loc = Vec.from_str(inst['origin']) try: plate = faithplate.PLATES.pop(inst['targetname']) except KeyError: LOGGER.warning( 'No faith plate info found for camera {}!', inst['targetname'], ) inst.remove() return # Remove the triggers. plate.trig.remove() if isinstance(plate, faithplate.StraightPlate): # Just point straight ahead. target_loc = base_loc + 512 * normal # And remove the helper. plate.helper_trig.remove() else: if isinstance(plate.target, Vec): target_loc = plate.target else: # We don't particularly care about aiming to the front of angled # panels. target_loc = plate.target.pos + 64 * plate.target.normal # Remove the helper and a bullseye. plate.target.remove_portal_helper() plate.target.bullseye_count -= 1 # Move three times to position the camera arms and lens. yaw_pos = Vec(conf['yaw_off']).rotate_by_str(inst['angles']) yaw_pos += base_loc pitch, yaw, _ = (target_loc - yaw_pos).to_angle() conditions.add_inst( vmf, targetname=inst['targetname'], file=conf['yaw_inst'], angles=Angle(yaw=yaw), origin=yaw_pos, ) pitch_pos = Vec(conf['pitch_off']) pitch_pos.rotate(yaw=yaw) pitch_pos.rotate_by_str(inst['angles']) pitch_pos += yaw_pos conditions.add_inst( vmf, targetname=inst['targetname'], file=conf['pitch_inst'], angles=Angle(pitch, yaw, 0.0), origin=pitch_pos, ) cam_pos = Vec(conf['cam_off']) cam_pos.rotate(pitch=pitch, yaw=yaw) cam_pos += pitch_pos # Recompute, since this can be slightly different if the camera is large. cam_angles = (target_loc - cam_pos).to_angle() ALL_CAMERAS.append(Camera(inst, cam_pos, cam_angles))
def res_camera(inst: Entity, res: Property): """Result for the camera component. """ conf = res.value normal = Vec(0, 0, 1).rotate_by_str(inst['angles']) if normal.z != 0: # Can't be on floor/ceiling! inst.remove() return base_yaw = math.degrees(math.atan2(normal.y, normal.x)) % 360 inst['angles'] = '0 {:g} 0'.format(base_yaw) inst_name = inst['targetname'] try: target, = inst.map.by_target[inst_name + '-target'] # type: Entity except ValueError: # No targets with that name inst.remove() return for trig in inst.map.by_class['trigger_catapult']: # type: Entity if trig['targetname'].startswith(inst_name): trig.remove() target_loc = Vec.from_str(target['origin']) target.remove() # Not needed... BULLSYE_LOCS[target_loc.as_tuple()] += 1 base_loc = Vec.from_str(inst['origin']) # Move three times to position the camera arms and lens. yaw_pos = Vec(conf['yaw_off']).rotate_by_str(inst['angles']) yaw_pos += base_loc pitch, yaw, _ = (target_loc - yaw_pos).to_angle() inst.map.create_ent( classname='func_instance', targetname=inst['targetname'], file=conf['yaw_inst'], angles='0 {:g} 0'.format(yaw), origin=yaw_pos, ) pitch_pos = Vec(conf['pitch_off']) pitch_pos.rotate(yaw=yaw) pitch_pos.rotate_by_str(inst['angles']) pitch_pos += yaw_pos inst.map.create_ent( classname='func_instance', targetname=inst['targetname'], file=conf['pitch_inst'], angles='{:g} {:g} 0'.format(pitch, yaw), origin=pitch_pos, ) cam_pos = Vec(conf['cam_off']) cam_pos.rotate(pitch=pitch, yaw=yaw) cam_pos += pitch_pos # Recompute, since this can be slightly different if the camera is large. cam_angles = (target_loc - cam_pos).to_angle() ALL_CAMERAS.append(Camera(inst, res.value, cam_pos, cam_angles))
def res_camera(inst: Entity, res: Property): """Result for the camera component. """ conf = res.value normal = Vec(0, 0, 1).rotate_by_str(inst['angles']) if normal.z != 0: # Can't be on floor/ceiling! inst.remove() return base_yaw = math.degrees(math.atan2(normal.y, normal.x)) % 360 inst['angles'] = '0 {:g} 0'.format(base_yaw) inst_name = inst['targetname'] try: [target] = inst.map.by_target[inst_name + '-target'] # type: Entity except ValueError: # No targets with that name inst.remove() return for trig in inst.map.by_class['trigger_catapult']: # type: Entity if trig['targetname'].startswith(inst_name): trig.remove() target_loc = Vec.from_str(target['origin']) target.remove() # Not needed... BULLSYE_LOCS[target_loc.as_tuple()] += 1 base_loc = Vec.from_str(inst['origin']) # Move three times to position the camera arms and lens. yaw_pos = Vec(conf['yaw_off']).rotate_by_str(inst['angles']) yaw_pos += base_loc pitch, yaw, _ = (target_loc - yaw_pos).to_angle() inst.map.create_ent( classname='func_instance', targetname=inst['targetname'], file=conf['yaw_inst'], angles='0 {:g} 0'.format(yaw), origin=yaw_pos, ) pitch_pos = Vec(conf['pitch_off']) pitch_pos.rotate(yaw=yaw) pitch_pos.rotate_by_str(inst['angles']) pitch_pos += yaw_pos inst.map.create_ent( classname='func_instance', targetname=inst['targetname'], file=conf['pitch_inst'], angles='{:g} {:g} 0'.format(pitch, yaw), origin=pitch_pos, ) cam_pos = Vec(conf['cam_off']) cam_pos.rotate(pitch=pitch, yaw=yaw) cam_pos += pitch_pos # Recompute, since this can be slightly different if the camera is large. cam_angles = (target_loc - cam_pos).to_angle() ALL_CAMERAS.append(Camera(inst, res.value, cam_pos, cam_angles))