BlockCam (æ¥æ¬èª)
3D Block Camera
BlockCam is a camera program for iOS and iPadOS that takes images via AVFoundation and then converts those images into simple 3D scenes. The scenes may be rotated and scaled by the user, and saved as a flat image.
BlockCam was written by Stuart Rankin.
Versioning for BlockCam is maintained in the Versioning.swift file and is automatically updated with each build as a pre-build script step. The updating includes build IDs, build numbers, times and dates, but version numbers must currently be updated by hand. The current build string below is also maintained by the same mechanism.
The versioning program does not currently update the BlockCam project file's version numbers.
Most recent build: Version 0.9 Alpha, Build 3287, Build date: 13 July 2021, 16:06
See VersionUpdater repository on GitHub for information on how versions and builds are updated.
BlockCam is designed to contain user-supplied information as much as possible. Any time user-identifiable information is used, BlockCam will ask for it explicitly. By design, BlockCam does not collect any user-identifiable information by default; the user must take active steps to allow collection of this type of information.
| Identifiable Information | Use | Storage |
|---|---|---|
| User Name | The user's name (entered by the user) to be stored in processed image metadata. | Stored in UserDefaults. |
| User Copyright | The user's copyright string (entered by the user) to be stored in processed image metadata. | Stored in UserDefaults. |
When the user instantiates BlockCam, it opens in live view mode (showing the view of the camera on the main screen). The user has the option of choosing one of three modes:
- Live View Mode This is the default mode and allows the user to take pictures of whatever the program shows. Once the picture is taken, it is processed then displayed in the view.
- Album Mode This mode allows the user to select an image from the camera roll on the device. That image is then processed the same way as a live view image would be. The user can also convert an existing video.
- Video Mode Not currently implemented. This mode allows users to make videos with the normal iOS/iPadOS video interface and process the video using the current settings.
Processed Mode Not currently implemented. This is intended to allow the user to view the output of the live view feed processed into a 3D scene. Given the slowness of the processing, this may not be feasible except for when running on faster, future platforms (or on a desktop system).
BlockCam has been tested on the following platforms:
- iPhone 6S+ with iOS 13.3
- iPhone 8 with iOS 13.3
- iPad Mini 4 with iPadOS 13.3
- iPad Pro 9.7 with iPadOS 13.3
- macOS 10.15.2 via MacCatalyst (see, however, Issues).
- The main issue is one of performance. When used on images of large size on older cell phones, performance slows dramatically. However, the selfie camera is actually very quick. BlockCam has certain mitigations in place (such as user settings) to help reduce some performance issues.
- Kanji is extraordinarily slow. To create an extruded image using kanji characters takes on the order of 6 minutes for an older iPhone.
- Only tested on the following: iPhone 6S+, iPhone 8, iPad Mini 4. iPad Pro 9.7.
- MacCatalyst does not support AVFoundation usage of the Mac camera, making things quite difficult. Work on the MacCatalyst version has stopped for now due to that impedement.
- Histograms are not yet implemented.
- Non-built-in geometric shapes seem to perform significantly slower than built-in shapes.
- iPadOS and iOS 13 seem to have a few extra debug statements left in them that lead to confusing debug sessions - specifically, "Can't end BackgroundTask" messages.
- Add more shapes, such as
starsor hearts and the like.
- Stars added - use
UIBezierPathto add more shapes.
- Add a processed-live view mode that shows a live view (similar to the photo mode right now) only processed. This will probably be very power hungry and slow and may work reliably only on the most recent hardware.
- Share videos - right now, only images can be shared.
Fully implement usage of pixellated data. Most code is in place. This feature saves processed image data at the pixellation level (eg, colors for each pixel region) as a file in the user's file system space. The advantage is to quicken processing when the user changes certain settings, such as shape or extrusion depth.Done.
There are four performance concerns for BlockCam:
- Memory This concern is mainly for video processing. Currently, BlockCam reads all frames of a video to process and resizes them as required, saving resized images in memory. By placing memory-intensive code in loops in
autoreleasepoolblocks, most concerns have been addressed. If it turns out that this is insufficient, a mitigation plan exists: Save all scratch images to local storage then read them singly and process them one at a time. This will slow things down but reduce memory pressure. - Time It takes a significant amount of time to process one image, especially if that image is large. The user interface provides controls for the user to reduce the size of the image to process.ãAdditionally, the user interface provides hints to the user with respect to which options are slower than others.
- Thermal Since BlockCam makes heavy use of the graphics processor, it is possible to overheat the device. When this happens (and if default settings have not been changed), BlockCam will immediately exit when the thermal condition becomes critical.
- Power Due to the same causes of thermal issues, the battery may be drained quickly when using BlockCam. If default settings are in place and the device enters a low power state, BlockCam will immediately exit.
BlockCam converts each image that is taken into a pixellated image via CoreImage filter CIPixellate. After pixellation, the processing algorithm then calculates the height determinate - the height determines either the size of a node or the extrusion of a node. Then, each pixel from the pixellated image is converted into a 3D shape (set by the user) and then added to the current scene in the 3D view.
All processing operations make use of the same code but may be called differently (or multiple times) depending on the user-facing mode in effect.
An image is acquired for processing. The source of the image is not important so long as it is a standard, iOS/iPadOS-readable image. The most common source of images will most likely be the live view camera. Other sources are the photo album and video frames.
The following image is the source for the processing. (This is an image I took of our garden in early winter.)
Given the performance expense of converting the image, the user has the option of reducing the amount of work done by having the source image resized to a smaller size. This may also occur without the user's intervention should videos be processed. (Processing videos tends to take a lot of memory, so even saving a few percent per image will help keep things less stressful on the system.) Some images are also rotated to 270° (or -90° if you prefer) and need to be rotated correctly. This is also done in the image conditioning step.
The processed image is then pixellated via Core Image filter functions. Specifically, the most common filter BlockCam uses is CIPixellate (although other pixellation filters are used depending on the final shape). The size of each pixellated region is depending on user settings. The smaller the size, the greater the impact on overall performance, though CIPixellate (and like filters) are still very fast. The reason why smaller pixellated regions increase performance is because more 3D nodes will be required later on.
The following image shows the pixellation of the original image. Note that each pixellated region is a solid color, which means BlockCam does not have to read the entire region to get the color - just one pixel.
The pixellated image is then parsed. This entails getting the color of each pixellated region. This is a slower than expected step. Getting individual pixel data from an image requires a great deal of image data manipulation just to get the image ready to be queried. At the end of this step, images are no longer used. A 2D array of color data is passed to the next step.
At this step, pixellated image data is saved to local file storage. This is to simplify minor visual changes later requested by the user.
The final node shape is a user setting. BlockCam allows users to select from one of many shapes - the built-in shapes tend to run faster than non-built-in shapes (for example, spheres are faster than pentagons). A 3D node is generated for each color from the Image Parsing step using the specified geometry. In order to show off the 3D-ness of the final scene, nodes are exaggerated in some dimension. For example, if cubes are the shape selected by the user, the length will be exaggerated. Exaggeration is determined by the color - the color is used to shade the diffuse surface of the node as well as to determine the height. Exaggeration is determined by a user-selectable determinant:
- Hue - The hue determines the exaggeration. This tends to lead to reds that are very tall as well as very short, given where reds live in the HSB hue circle.
- Saturation - Brightly color pixellated areas tend to be highlighted.
- Brightness - This is the default determinant and probably the best - the brightness of the color of the pixellate region determines the exaggeration so bright areas are highest.
- Red, Green, Blue - The specified RGB color channel is used as the exaggeration determinant.
- Cyan, Magenta, Yellow, Black - The specified CMYK color channel is used as the exaggeration determinant (with Black leading to some very strange-looking results). (While some calculation is required to convert from RGB to CMYK, the amount is relatively minor and does not adversely affect performance.)
Once a node has been created, it is added to a master node. Once all nodes have been created and placed in to the master node, the master node itself is placed in to the 3D scene.
- A master node is used to make later animations an order of magnitude easier to manage.
While this may seem a trivial step, it is very tricky when converting videos. If converting an image, All that happens is the 3D scene is updated and eventually shown to the user (usually within 0.5 to 2.0 seconds). For videos, it is critical to get the timing of the display right: to convert a video, each frame is run through these steps and then a snapshot is taken of the 3D scene. If the snapshot is taken before the scene has been displayed, the result will be a pure black image, which isn't what the user wants to see. Therefore, BlockCam must participate in the SCNSceneRendererDelegate set of functions to know when a scene is actually visible to the user.
The following image is the final, processed version of the image. This is the output of a snapshot() call on the SCNView. The sample uses extruded blocks and is being viewed in the default camera orientation.
Once the image is display, the user has the option to save it as is or edit some visual aspects or rotate or zoom in or out, and then save it (again, perhaps). For videos, once a snapshot of the 3D scene is captured, the scene is disposed of.
Depending on the value of .SaveOriginalImageAction, the original image will be saved. When the user saves the processed image, metadata is saved along with the processed image. The metadata consists of the name and version of the program as well as the parameters in effect when the image was created.
Saving processed files is a multi-step process:
- The image is saved in the
/Scratchdirectory as a standard.jpgfile. - Metadata is added to the saved image which is then resaved as a different file (still as a
.jpgfile). - The original file is deleted.
- The modified file is then copied to the photo roll (using
PHAssetCreationRequestwith the appropriate parameters set - this is needed because the more common method to move images to the photo roll strips Exif data). - On success, the modified is deleted from the
/Scratchdirectory.
BlockCam saves metadata in processed files.
| Group | Tag | Stored values |
|---|---|---|
| TIFF | Artist | If enabled by the user, the user's name. |
| TIFF | Copyright | If enabled by the user, the user's copyright string. |
| TIFF | Software | BlockCam's name, version, and build numbers. |
| Exif | UserComment | List of parameters used to generate the processed image. |
See also the Privacy discussion.
A simplified flow diagram for image processing is shown below.
Due to the amount of time it takes to preprocess and pixellate an image, every time a new image is processed, pixellation data (consisting of an array of colors) is saved to the device's file system. If the user then changes a parameter (such as a 3D shape), preprocessing has already been completed and the pixellation data is reused. This can potentially save a great deal of time.
If the user changes a parameter that affects preprocessing, the image is reprocessed from the beginning. (For example, the changing the block size will cause a full reprocessing cycle to be executed.)
A simplified flow diagram for video processing is shown below. The cube refers back to the Image Flow.
Currently, the green box ("Processed Frame") does not function as expected/required so as of current writing, video creation is not supported.
BlockCam logs messages and status at runtime to the debug console (if present, and in the vast majority of instances, this will not be present) and to a local SQLite database. This allows for post-mortem debugging should the need arise.
Given Apple's policy on data rentention (not to mention the EU's policies), it is entirely likely logging will be removed (via compile-time flags) for any released version of BlockCam.
All user settings (and a few process settings) are stored via the Settings class. This class encapsulates a storage mechanism that is invisible to the rest of the program. Currently, the storage mechanism is UserDefaults. Should settings become more complex, it is straightforward to migrate this to a database.
To access settings, callers must use the provided methods of the Settings class. This helps to ensure data type integrity.
The Settings class also provides setting-level notification of changes (which was the primary reason to create the class in the first place).
BlockCam settings are presented below.
| Symbol | Type | Default | Usage |
|---|---|---|---|
| .Initialized | String | "Initialized" | Flag that determines whether settings have been initialized or not. When BlockCam first runs, if .Initialized is nil or empty, it assumes it is the first time BlockCam has been run and so therefore writes default values for all settings. |
| .BlockSize | Integer | 48 | Block size for image processing. This is the square size of each pixellated region. |
| .ShapeType | String | "Blocks" | The same of the 3D object at each pixellation region. Cast from an enum. |
| .InvertHeight | Boolean | false | The invert height/size determination flag. |
| .HeightSource | String | "Brightness" | The color channel to use to determine height/size. Cast from an enum. |
| .ImageSizeConstraints | String | "Medium" | Determines the amount of reduction in size of the image to do before processing it for performance reasons. Cast from an enum. Actual value interpreted at run time. |
| .VerticalExaggeration | String | "Medium" | The amount of vertical exaggeration to perform when extruding or enlarging 3D shapes. Cast from an enum. |
| .InputQuality | Integer | 2 | Value that indicates the input quality. Ranges from 0 to 3 with 3 being the highest quality (and slowest to process). |
| .CurrentCamera | String | "Back" | The position of the last camera used. Either front or back. Cast from an enum. |
| .LightColor | String | "White" | Name of the color of the light. Cast from an enum. May be converted to a color library type of color later. |
| .LightType | String | "Omni" | Name of the type of light used to illuminate the scene. Cast from an enum. |
| .LightIntensity | String | "Normal" | Intensity of the light used to illuminate the scene. Actual value determined at runtime. Cast from an enum. |
| .FieldOfView | String | "Normal" | Field of view of the camera. Actual value is determined at runtime. Cast from an enum. |
| .ShowHistogram | Boolean | false | Show the histogram display. Not currently implemented. |
| .HistogramBucketCount | Integer | 256 | Number of colors in the histogram display. Not currently implemented. |
| .InitialView | String | "LiveView" | The last view seen by the user (such as live view, albums, etc). |
| .FullyExtrudeLetters | Boolean | true | Determines if letters are fully extruded or only partially extruded. |
| .LetterSmoothness | String | "Smooth" | Determines how smoothly to create curves in letters. High quality curves comes at a large performance cost. Actual value determined at runtime. Cast from an enum. |
| .LetterFont | String | "Futura" | The font (and optional weight) to use to render extruded letters. If the font does not exist on the system, BlockCam will enter an undefined state. |
| .RandomCharacterSource | String | "Latin" | Named Unicode range of characters to use as a source for random letters when extruding characters. Multiple ranges may be specified by separating each from the others with a comma. |
| .VideoFPS | Integer | 1 | Not currently used. |
| .VideoDimensions | String | "Smallest" | Determines the final video size when generating video. Actual value determined at runtime. Cast from an enum. |
| .VideoBlockSize | Integer | 48 | Block size for video processing. This is the square size of each pixellated region. |
| .UseMetal | Boolean | true | Flag that tells BlockCam to use Metal rather than OpenGL. |
| .AntialiasingMode | Integer | 0 | Determines the antialiasing mode. |
| .InitialBestFit | Boolean | false | If true, BlockCam will try to fit all nodes into the view with as tightly as possible. |
| .SaveOriginalImageAction | String | "Always" | Determines how and when to save original images. Cast from an enum. |
| .NextSequentialInteger | Integer | 0 | Used for file name generation. |
| .LoopSequentialIntegerAfter | Integer | 9999 | Determines when to loop to the start when using sequential integers. |
| .StartSequentialIntegerAt | Integer | 1 | Starting value for sequential integers. |
| .IncreaseStarApexesWithProminence | Boolean | false | If true, the number of apexes for star shapes increases with the prominence of the color height. |
| .StarApexCount | Integer | 5 | Number of apexes for stars. If .IncreaseStarApexesWithProminence is true, this is the starting number of apexes. |
| .HaltWhenCriticalThermal | Boolean | true | If true, BlockCam will halt (via a fatalError call) when it receives a critical thermal alert. This may violate Apple guidelines and may be removed. |
| .HaltOnLowPower | Boolean | true | If true, BlockCam will halt (via a fatalError call) when it receives a low power alert. This may violate Apple guidelines and may be removed. |
| .BestFitOffset | Double | 2.0 | Value to use to back the camera away when .InitialBestFit is true to give a bit more negative space to the image. |
| .LightingModel | String | "Phong" | Surface material lighting model. Cast from an enum. |
| .CappedLineBallLocation | String | "Top" | Location of the ball ("cap") for CappedLine shaped nodes. Cast from an enum. |
| .LoggingEnabled | Boolean | false | Enable logging flag. |
| .FontSize | Integer | 36 | The font size for extruded letters. |
| .EnableUISounds | Boolean | true | Flag to play UI sounds (such as when a button is pressed). If this value is false, all other sound flags are ignored. |
| .EnableShutterSound | Boolean | false | Flag to play a shutter sound when the camera button is pressed. In some geographic locations, this always happens and setting this value will have no effect. |
| .EnableImageProcessingSound | Boolean | true | Flag to play a sound at the start and end of image processing. Since image processing is time-consuming, this helps the user understand when the image is completed. |
| .EnableVideoRecordingSound | Boolean | true | Flag to play a sound when the user starts and stops recording a video. |
| .EnableButtonPressSounds | Boolean | true | Flag to play a sound when the user presses buttons. |
| .EnableOptionSelectSounds | Boolean | true | Flag to play a sound when the user selects an option in the on-screen settings display. |
| .EnableCrashSounds | Boolean | false | Flag to play a sound when a crash dialog is shown. Enabled only when compiled in #DEBUG mode. |
| .MeshDotSize | String | "Medium" | Size of the center dot for meshes. If .None is used, no center dot will be displayed. Cast from an enum. |
| .MeshLineThickness | String | "Medium" | Thickness of mesh lines. Cast from an enum. |
| .RadiatingLineThickness | String | "Medium" | Thickness of radiating line shapes. Cast from an enum. |
| .RadiatingLineCount | Integer | 8 | Number of radiating lines in a radiating line shape. 4 is for lines pointing towards the cardinal directions, 8 for the cardinal directions and inbetween, and 16 for 8 more lines in the z-plane. |
| .BlockChamferSize | String | "None" | The chamfer radius/edge smoothness for block shapes. Cast from an enum. |
| .MaxImageDimension | Integer | 1024 | Maximum dimension of an image. If an image to process is larger, it will be resized such that the longest dimension is this value. |
| .AddUserDataToExif | Boolean | false | Flag to add user-created information to processed images' Exif block. If compiled in #DEBUG mode, this value defaults to true. |
| .UserName | String | "" | (Default is blank.) The user-supplied name that is added to processed images' Exif block. This happens only if .AddUserDataToExif is true. If compiled in #DEBUG mode, this value defaults to "Stuart Rankin". |
| .UserCopyright | String | "" | (Default is blank.) The user-supplied copyright string that is added to processed images' Exif block. This happens only if .AddUserDataToExif is true. If compiled in #DEBUG mode, this value defaults to "Attribution 3.0 Unported (CC BY 3.0)". |
| .ConeIsInverted | Boolean | true | Determines if cone-shapes are inverted in terms of z depth. |
| .ConeTopOptions | String | .TopIsZero.rawValue |
Options for determining the top radius of the cone. |
| .ConeBaseOptions | String | .BaseIsSide.rawValue |
Options for determining the base radius of the cone. |
| .ShowSplashScreen | Boolean | true | Flag that determines whether the splash screen is shown at start up or not. |
| .HueShapeList | String | "" | List of shapes for the hue variant shape type. |
| .SaturationShapeList | String | "" | List of shapes for the saturation variant shape type. |
| .BrightnessShapeList | String | "" | List of shapes for the brightness variant shape type. |
BlockCam uses 3D processing, which exercises the device's graphics chip. If the user specifies highest quality settings, it is possible certain extreme conditions may occur. To help preserve the device from damage, settings are available to abort execution of BlockCam when that happens.
| Event | Action | Controlling Setting |
|---|---|---|
| Thermal | If a thermal event reaches the critical stage (literally .critical in the notification), if the setting is true, a fatal error will be generated to reduce any thermal stress created by BlockCam. |
.HaltWhenTooHot |
| Battery | If the battery enters a low power state, if the setting is true, a fatal error will be generated to help preserve the battery's life before recharging. |
.HaltOnLowPower |
BlockCam supports the following visuals:
The following shapes are currently supported (or planned to be supported) for extrusion effects:
| Shape | Native | Notes |
|---|---|---|
| Blocks | Yes - SCNBox |
Native box shapes lengthened along the Z axis. |
| Triangles | No | Custom equilateral triangle shapes. |
| Pentagons | No | Custom equilateral pentagon shapes. |
| Hexagons | No | Custom equilateral hexagonal shapes. |
| Octogons | No | Custom equilateral octagonal shapes. |
| Pyramids | Yes - SCNPyramid |
Native pyramid shapes. |
| Toroids | Yes - SCNTorus |
Native torus shapes. |
| Cylinders | Yes - SCNCylinder |
Native cylinder shapes - makes for nice elevated circles. |
| Spheres | Yes - SCNSphere |
Native sphere shapes. |
| Capsules | Yes - SCNCapsule |
Native capsule shapes. Not as interesting as they sound. |
| Tetrahedrons | No | Custom equilateral tetrahedron solid. |
| Stars | No | Custom star shapes (with radially equal apexes). Can vary the number of apexes. |
| CombinedForRGB | Yes - combination | Combined sphere, torus, and capsule. |
| CombinedForHSB | Yes - combination | Combined sphere, torus, and capsule. |
| Meshes | No | Not currently implemented. |
| Letters | Yes - SCNText |
Native extruded text. Tends to be extraordinarily slow, especially with non-Latin alphabets. |
| Lines | Yes - SCNCapsule |
Very thin capsule shape. |
| CappedLines | Yes - combination | Very thin capsule shape with a sphere placed at the top, middle, or bottom of the line depending on user settings. |
| RadiatingLines | Yes - combination | Multiple lines radiating from the center point. User can specify how many lines. This is a performance-heavy shape. |
| HueVarying | variants | The shape at a given point is determined by the hue of the pixellated region so the actual final shape will vary. |
| SaturationVarying | variants | The shape at a given point is determined by the saturation of the pixellated region so the actual final shape will vary. |
| BrightnessVarying | variants | The shape at a given point is determined by the brightness of the pixellated region so the actual final shape will vary. |
Each shape for a representative pixellated region is extruded or enlarged. The determination of the extrusion depth or enlarged size depends on the color of the pixellated region.
| Color Channel | Usage |
|---|---|
| Hue | The hue of the color determines the depth/size of the 3D object. Note that hue values are cyclical (with 0.0 being essentially the same as 1.0) so reddish pixels tend to be subdued while green are highlighted. |
| Saturation | The color saturation value determines depth/size. Brighter colors will be bigger. |
| Brightness | The brightness of the color determines depth/size. This is the default value and how most people would expect the program to work. |
| Red | The red channel is used to determine depth/size. |
| Green | The green channel is used to determine depth/size. |
| Blue | The blue channel is used to determine depth/size. |
| Cyan | A synthetic cyan channel (from CMYK) is used to determine depth/size. |
| Magenta | A synthetic magenta channel (from CMYK) is used to determine depth/size. |
| Yellow | A synthetic yellow channel (from CMYK) is used to determine depth/size. |
| Black | A synthetic black channel (from CMYK) is used to determine depth/size. |
| YUV: Y | The synthetic Y channel from a YUV conversion. |
| YUV: U | The synthetic U channel from a YUV conversion. |
| YUV: V | The synthetic V channel from a YUV conversion. |
BlockCam supports an inverted flag. This means if the user sets invert, the depth/size is a reciprocol of itself, making dark areas prominent and light areas subdued or hidden.
BlockCam supports changing the color of the light as well as the type of the light. Colors are currently restricted to a small set of pre-defined colors. The types of lights parallel SceneKit's standard, non-parametized lights (such as .omni and .spot).
The light's position is not currently adjustable by the user.
BlockCam makes use of SCNView's allowsCameraControl flag to let the user enlarge, shink, or rotate (in three axes) by way of gestures.
When initially rendered, the result may appear to be relatively far away from the view. BlockCam has a user-settable flag to fit the image to the view. This feature tends to confuse allowsCameraControl with respect to enlarging and shrinking.
This section will discuss various implementation-level details.
BlockCam was written in Swift 5 with Xcode 11.3.
Given the lengthy amount of time it takes to process images, all image processing is done on a background thread. This requires all communication to update the user via the UI to be done with the proper threading calls.
TBD
BlockCam is copyright © 2019, 2020 by Stuart Rankin
æ¥æ¬èªç «Google翻蚳ã§ç¿»èš³Â»
3Dãããã¯ã«ã¡ã©
BlockCamã¯iOSããã³iPadOSçšã®ã«ã¡ã©ããã°ã©ã ã§ãAVFoundationãä»ããŠç»åãååŸãããããã®ç»åãåçŽãª3Dã·ãŒã³ã«å€æããŸããã·ãŒã³ã¯ããŠãŒã¶ãŒã«ãã£ãŠå転ããã³æ¡å€§çž®å°ããããã©ããã€ã¡ãŒãžãšããŠä¿åãããŸãã
BlockCamã¯Stuart Rankinã«ãã£ãŠäœæãããŸããã
BlockCamã®ããŒãžã§ã³ç®¡ç㯠Versioning.swiftãã¡ã€ã«ã§ç®¡çããããã«ãåã®ã¹ã¯ãªããã¹ããããšããŠãã«ãããšã«èªåçã«æŽæ°ãããŸãã æŽæ°ã«ã¯ãã«ãIDããã«ãçªå·ãæå»ãæ¥ä»ãå«ãŸããŸãããçŸåšãããŒãžã§ã³çªå·ã¯æåã§æŽæ°ããå¿
èŠããããŸãã 以äžã®çŸåšã®ãã«ãæååãåãã¡ã«ããºã ã«ãã£ãŠç¶æãããŸãã
çŸåšãããŒãžã§ã³ç®¡çããã°ã©ã ã¯BlockCamãããžã§ã¯ããã¡ã€ã«ã®ããŒãžã§ã³çªå·ãæŽæ°ããŸããã
ææ°ã®ãã«ãïŒããŒãžã§ã³æ å ±ã«ã€ããŠã¯ãè±èªã®ã»ã¯ã·ã§ã³ãåç §ããŠãã ããã
ããŒãžã§ã³ãšãã«ãã®æŽæ°æ¹æ³ã«ã€ããŠã¯ãGitHubã®[VersionUpdater]ïŒhttps://github.com/sjrankin/VersionUpdaterïŒãªããžããªãåç §ããŠãã ããã
BlockCamã¯ãå¯èœãªéããŠãŒã¶ãŒãæäŸããæ å ±ãå«ãããã«èšèšãããŠããŸãã ãŠãŒã¶ãŒãç¹å®ã§ããæ å ±ã䜿çšããããã³ã«ãBlockCamã¯ãããæç€ºçã«èŠæ±ããŸãã èšèšäžãBlockCamã¯ããã©ã«ãã§ãŠãŒã¶ãŒãç¹å®ã§ããæ å ±ãåéããŸããã ãŠãŒã¶ãŒã¯ããã®ã¿ã€ãã®æ å ±ã®åéãèš±å¯ããããã«ã¢ã¯ãã£ããªæé ãå®è¡ããå¿ èŠããããŸãã
| è奿 å ± | äœ¿çš | ä¿ç®¡ |
|---|---|---|
| ãŠãŒã¶ãŒå | åŠçãããç»åã®ã¡ã¿ããŒã¿ã«ä¿åããããŠãŒã¶ãŒã®ååïŒãŠãŒã¶ãŒãå ¥åïŒã | ãUserDefaultsãã«ä¿åãããŸãã |
| ãŠãŒã¶ãŒèäœæš© | åŠçãããç»åã¡ã¿ããŒã¿ã«ä¿åããããŠãŒã¶ãŒã®èäœæš©æååïŒãŠãŒã¶ãŒãå ¥åïŒã | ãUserDefaultsãã«ä¿åãããŸãã |
ãŠãŒã¶ãŒãBlockCamãã€ã³ã¹ã¿ã³ã¹åãããšãã©ã€ããã¥ãŒã¢ãŒãã§éããŸãïŒã¡ã€ã³ç»é¢ã«ã«ã¡ã©ã®ãã¥ãŒã衚瀺ïŒããŠãŒã¶ãŒã«ã¯ã次ã®3ã€ã®ã¢ãŒãã®ãããããéžæãããªãã·ã§ã³ããããŸãã
- ã©ã€ããã¥ãŒã¢ãŒãããã¯ããã©ã«ãã®ã¢ãŒãã§ããããŠãŒã¶ãŒã¯ããã°ã©ã ã衚瀺ãããã®ãäœã§ãåçã«æ®ãããšãã§ããŸãã åçãæ®åœ±ããããšãåŠçãããŠãã¥ãŒã«è¡šç€ºãããŸãã
- ã¢ã«ãã ã¢ãŒããã®ã¢ãŒãã§ã¯ããŠãŒã¶ãŒã¯ããã€ã¹ã®ã«ã¡ã©ããŒã«ããç»åãéžæã§ããŸãã ãã®ç»åã¯ãã©ã€ããã¥ãŒç»åãšåãæ¹æ³ã§åŠçãããŸãã ãŠãŒã¶ãŒã¯æ¢åã®ãããªã倿ããããšãã§ããŸãã
- ãããªã¢ãŒã çŸåšå®è£
ãããŠããŸããã ãã®ã¢ãŒãã§ã¯ããŠãŒã¶ãŒã¯éåžžã®iOS / iPadOSãããªã€ã³ã¿ãŒãã§ã€ã¹ã§ãããªãäœæããçŸåšã®èšå®ã䜿çšããŠãããªãåŠçã§ããŸãã
4. åŠçã¢ãŒã çŸåšå®è£ ãããŠããŸããã ããã¯ã3Dã·ãŒã³ã«åŠçãããã©ã€ããã¥ãŒãã£ãŒãã®åºåããŠãŒã¶ãŒã衚瀺ã§ããããã«ããããšãç®çãšããŠããŸãã åŠçãé ãããšãèãããšãããã¯ãããé«éã®å°æ¥ã®ãã©ãããã©ãŒã ïŒãŸãã¯ãã¹ã¯ãããã·ã¹ãã ïŒã§å®è¡ããå Žåãé€ããŠãå®è¡äžå¯èœãªå ŽåããããŸãã
BlockCamã¯ã次ã®ãã©ãããã©ãŒã ã§ãã¹ããããŠããŸãã
- iOS 13.3ãæèŒããiPhone 6S +
- iOS 13.3ãæèŒããiPhone 8
- iPadOS 13.3ãæèŒããiPad Mini 4
- iPadOS 13.3ãæèŒããiPad Pro 9.7
1.äž»ãªåé¡ã¯ããã©ãŒãã³ã¹ã§ãã å€ãæºåž¯é»è©±ã®å€§ããªãµã€ãºã®ç»åã§äœ¿çšãããšãããã©ãŒãã³ã¹ãå€§å¹ ã«äœäžããŸãã ãã ããã»ã«ãã£ãŒã«ã¡ã©ã¯å®éã«ã¯éåžžã«é«éã§ãã BlockCamã«ã¯ãããã©ãŒãã³ã¹ã®åé¡ã軜æžããã®ã«åœ¹ç«ã€ç¹å®ã®è»œæžçïŒãŠãŒã¶ãŒèšå®ãªã©ïŒããããŸãã 2. *挢åã¯éåžžã«é ãã§ãã*挢åã䜿çšããŠæŒãåºãç»åãäœæããã«ã¯ãå€ãiPhoneã®å Žåã6åçšåºŠããããŸãã 3.以äžã§ã®ã¿ãã¹ãæžã¿ïŒiPhone 6S +ãiPhone 8ãiPad Mini4ãiPadPro 9.7ã 4. MacCatalystã¯ãMacã«ã¡ã©ã®AVFoundationã®äœ¿çšããµããŒãããŠããªããããéåžžã«å°é£ã§ãã MacCatalystããŒãžã§ã³ã§ã®äœæ¥ã¯ããã®åŠšå®³ã®ããçŸåšã®ãšãã忢ããŠããŸãã 5.ãã¹ãã°ã©ã ã¯ãŸã å®è£ ãããŠããŸããã 6.éçµã¿èŸŒã¿ã®å¹ŸäœåŠçå³åœ¢ã¯ãçµã¿èŸŒã¿ã®å³åœ¢ãããå€§å¹ ã«é ãããã«èŠããŸãã 7. iPadOSããã³iOS 13ã«ã¯ãæ··ä¹±ãããããã°ã»ãã·ã§ã³ã«ã€ãªããããã€ãã®è¿œå ã®ãããã°ã¹ããŒãã¡ã³ããæ®ã£ãŠããããã§ããå ·äœçã«ã¯ããBackgroundTaskãçµäºã§ããŸãããã¡ãã»ãŒãžã§ãã
æãããŒããªã©ã®å³åœ¢ã远å ããŸãã  -ã¹ã¿ãŒã远å ãããŸãã-UIBezierPathã䜿çšããŠããã«ã·ã§ã€ãã远å ããŸãã  2.åŠçæžã¿ã®ã©ã€ããã¥ãŒïŒçŸåšã®åçã¢ãŒããšåæ§ïŒã®ã¿ã衚瀺ããåŠçæžã¿ã©ã€ããã¥ãŒã¢ãŒãã远å ããŸãã ããã¯ããããéåžžã«é»åãæ¶è²»ããé ããªããææ°ã®ããŒããŠã§ã¢ã§ã®ã¿ç¢ºå®ã«åäœããå¯èœæ§ããããŸãã  3.ãããªãå ±æãã-çŸåšãç»åã®ã¿ãå ±æã§ããŸãã  4.ãã¯ã»ã«åãããããŒã¿ã®äœ¿çšãå®å šã«å®è£ ããŸãã ã»ãšãã©ã®ã³ãŒããé 眮ãããŠããŸãã ãã®æ©èœã¯ãåŠçãããç»åããŒã¿ããã¯ã»ã«åã¬ãã«ïŒããšãã°ãåãã¯ã»ã«é åã®è²ïŒã§ãŠãŒã¶ãŒã®ãã¡ã€ã«ã·ã¹ãã 空éã«ãã¡ã€ã«ãšããŠä¿åããŸãã å©ç¹ã¯ã圢ç¶ãæŒãåºãã®æ·±ããªã©ã®ç¹å®ã®èšå®ããŠãŒã¶ãŒã倿Žãããšãã«åŠçãé«éåããããšã§ãã
BlockCamã«ã¯ãããã©ãŒãã³ã¹ã«é¢ãã4ã€ã®æžå¿µäºé ããããŸãã
- ã¡ã¢ãªãã®æžå¿µã¯äž»ã«ãããªåŠçã«é¢ãããã®ã§ããçŸåšãBlockCamã¯ãããªã®ãã¹ãŠã®ãã¬ãŒã ãèªã¿åã£ãŠåŠçããå¿ èŠã«å¿ããŠãµã€ãºã倿ŽããŠããµã€ãºå€æŽãããç»åãã¡ã¢ãªã«ä¿åããŸããã¡ã¢ãªã倧éã«æ¶è²»ããã³ãŒãããautoreleasepoolããããã¯ã®ã«ãŒãã«é 眮ããããšã§ãã»ãšãã©ã®æžå¿µäºé ã«å¯ŸåŠããŸããããããäžååã§ããããšã倿ããå Žåã軜æžèšç»ãååšããŸãããã¹ãŠã®ã¹ã¯ã©ããã€ã¡ãŒãžãããŒã«ã«ã¹ãã¬ãŒãžã«ä¿åãããããã1ã€ãã€èªã¿åããäžåºŠã«1ã€ãã€åŠçããŸããããã«ããé床ã¯äœäžããŸãããã¡ã¢ãªã®è² è·ã¯è»œæžãããŸãã
- æé 1ã€ã®ç»åã®åŠçã«ã¯ãç¹ã«ãã®ç»åã倧ããå Žåãããªãã®æéãããããŸãããŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ã¯ãåŠçããç»åã®ãµã€ãºãçž®å°ããããã®ã³ã³ãããŒã«ããŠãŒã¶ãŒã«æäŸããŸããããã«ããŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ã¯ãä»ã®ãªãã·ã§ã³ãããé ããªãã·ã§ã³ã«é¢ããŠãŠãŒã¶ãŒã«ãã³ããæäŸããŸãã
- ç± BlockCamã¯ã°ã©ãã£ãã¯ããã»ããµãå€çšãããããããã€ã¹ãéç±ããå¯èœæ§ããããŸãããããçºçããå ŽåïŒããã³ããã©ã«ãèšå®ã倿ŽãããŠããªãå ŽåïŒã枩床æ¡ä»¶ãé倧ã«ãªããšBlockCamã¯ããã«çµäºããŸãã
- é»åç±åé¡ã®åãåå ã«ãããBlockCamã䜿çšãããšãããããªãŒãããã«æ¶èããå ŽåããããŸããããã©ã«ãèšå®ãèšå®ãããŠããŠãããã€ã¹ãäœé»åç¶æ ã«ãªããšãBlockCamã¯ããã«çµäºããŸãã
BlockCamã¯ãåã蟌ãŸããåç»åãCoreImageãã£ã«ã¿ãŒ CIPixellateãä»ããŠãã¯ã»ã«åãããç»åã«å€æããŸãã ãã¯ã»ã«åã®åŸãåŠçã¢ã«ãŽãªãºã ã¯é«ãã®æ±ºå®ãèšç®ããŸã-é«ãã¯ããŒãã®ãµã€ãºãŸãã¯ããŒãã®æŒãåºããæ±ºå®ããŸãã æ¬¡ã«ããã¯ã»ã«åãããç»åã®åãã¯ã»ã«ã3D圢ç¶ïŒãŠãŒã¶ãŒãèšå®ïŒã«å€æããã3Dãã¥ãŒã®çŸåšã®ã·ãŒã³ã«è¿œå ãããŸãã
ãã¹ãŠã®åŠçæäœã¯åãã³ãŒãã䜿çšããŸãããæå¹ãªãŠãŒã¶ãŒåãã¢ãŒãã«å¿ããŠç°ãªãæ¹æ³ïŒãŸãã¯è€æ°åïŒã§åŒã³åºãããšãã§ããŸãã
åŠçã®ããã«ç»åãååŸãããŸããç»åã®ãœãŒã¹ã¯ãiOS / iPadOSã§èªã¿åãå¯èœãªæšæºã®ç»åã§ããéãéèŠã§ã¯ãããŸãããç»åã®æãäžè¬çãªãœãŒã¹ã¯ãããããã©ã€ããã¥ãŒã«ã¡ã©ã§ããä»ã®ãœãŒã¹ã¯ããã©ãã¢ã«ãã ãšãããªãã¬ãŒã ã§ãã
次ã®ç»åã¯ãåŠçã®ãœãŒã¹ã§ãã ïŒããã¯ç§ãåå¬ã«åºã§æ®ã£ãç»åã§ããïŒ
ç»åã倿ããããã®ããã©ãŒãã³ã¹ã®ç ç²ãèãããšããŠãŒã¶ãŒã¯ãœãŒã¹ç»åãããå°ããªãµã€ãºã«ãµã€ãºå€æŽããããšã«ãããå®è¡ãããäœæ¥éãåæžãããªãã·ã§ã³ããããŸããããã¯ããããªãåŠçãããå ŽåããŠãŒã¶ãŒã®ä»å ¥ãªãã«çºçããããšããããŸãã ïŒãããªã®åŠçã¯å€ãã®ã¡ã¢ãªãæ¶è²»ããåŸåããããããç»åããšã«æ°ããŒã»ã³ããä¿åããŠãã·ã¹ãã ã®ã¹ãã¬ã¹ã軜æžã§ããŸããïŒäžéšã®ç»åã¯270°ïŒãŸãã¯å¿ èŠã«å¿ããŠ-90°ïŒã«å転ãããæ£ããå転ããŸããããã¯ãç»å調æŽã¹ãããã§ãè¡ãããŸãã
åŠçãããç»åã¯ãCore Imageãã£ã«ã¿ãŒé¢æ°ãä»ããŠãã¯ã»ã«åãããŸããå ·äœçã«ã¯ãBlockCamã䜿çšããæãäžè¬çãªãã£ã«ã¿ãŒã¯ãCIPixellateãã§ãïŒãã ããæçµçãªåœ¢ç¶ã«å¿ããŠä»ã®ãã¯ã»ã«åãã£ã«ã¿ãŒã䜿çšãããŸãïŒãåãã¯ã»ã«åé åã®ãµã€ãºã¯ããŠãŒã¶ãŒèšå®ã«ãã£ãŠç°ãªããŸãããµã€ãºãå°ããã»ã©ãå šäœçãªããã©ãŒãã³ã¹ãžã®åœ±é¿ã¯å€§ãããªããŸããããCIPixellateãïŒããã³ãã£ã«ã¿ãŒãšåæ§ïŒã¯äŸç¶ãšããŠéåžžã«é«éã§ãããã¯ã»ã«åãããé åãå°ãããªããšããã©ãŒãã³ã¹ãåäžããçç±ã¯ãåŸã§ããå€ãã®3DããŒããå¿ èŠã«ãªãããã§ãã
次ã®ç»åã¯ãå ã®ç»åã®ãã¯ã»ã«åã瀺ããŠããŸããåãã¯ã»ã«åãããé åã¯åè²ã§ããããšã«æ³šæããŠãã ãããã€ãŸããBlockCamã¯é åå šäœãèªã¿åã£ãŠè²ãååŸããå¿ èŠã¯ãªãã1ãã¯ã»ã«ã ãã§ãã
次ã«ããã¯ã»ã«åãããç»åãè§£æãããŸããããã«ã¯ããã¯ã»ã«åãããåé åã®è²ãååŸããå¿ èŠããããŸããããã¯äºæ³ãããé ãã¹ãããã§ããç»åããåã ã®ãã¯ã»ã«ããŒã¿ãååŸããã«ã¯ãç»åãç §äŒã§ããããã«ããããã ãã«å€§éã®ç»åããŒã¿æäœãå¿ èŠã§ãããã®æé ã®æåŸã«ãç»åã¯äœ¿çšãããªããªããŸããã«ã©ãŒããŒã¿ã®2Dé åãæ¬¡ã®ã¹ãããã«æž¡ãããŸãã
ãã®ã¹ãããã§ã¯ããã¯ã»ã«åãããç»åããŒã¿ãããŒã«ã«ãã¡ã€ã«ã¹ãã¬ãŒãžã«ä¿åãããŸãã ããã¯ãåŸã§ãŠãŒã¶ãŒãèŠæ±ããå°ããªèŠèŠçãªå€æŽãç°¡çŽ åããããã§ãã
æçµçãªããŒã圢ç¶ã¯ãŠãŒã¶ãŒèšå®ã§ãã BlockCamã䜿çšãããšããŠãŒã¶ãŒã¯å€ãã®åœ¢ç¶ã®ãããããéžæã§ããŸããçµã¿èŸŒã¿ã®åœ¢ç¶ã¯ãéçµã¿èŸŒã¿ã®åœ¢ç¶ãããéãåäœããåŸåããããŸãïŒããšãã°ãçäœã¯äºè§åœ¢ãããé«éã§ãïŒãæå®ãããžãªã¡ããªã䜿çšããŠãã€ã¡ãŒãžè§£æã¹ãããããåè²ã®3DããŒããçæãããŸããæçµã·ãŒã³ã®3Dæ§ãèªç€ºããããã«ãããŒãã¯ããæ¬¡å ã§èªåŒµãããŠããŸããããšãã°ããã¥ââãŒãããŠãŒã¶ãŒãéžæãã圢ç¶ã§ããå Žåãé·ãã¯èªåŒµãããŸããèªåŒµã¯è²ã«ãã£ãŠæ±ºå®ãããŸã-è²ã¯ãããŒãã®æ¡æ£è¡šé¢ãé°åœ±ä»ãããããã«ããŸãé«ããæ±ºå®ããããã«äœ¿çšãããŸããèªåŒµã¯ããŠãŒã¶ãŒãéžæå¯èœãªæ±ºå®èŠå ã«ãã£ãŠæ±ºå®ãããŸãã
- è²çž è²çžã¯èªåŒµã決å®ããŸããããã¯ãèµ€ãHSBè²çžç°ã®ã©ãã«ååšããããèãããšãéåžžã«èãé«ãã ãã§ãªãéåžžã«çãèµ€ã«ã€ãªããåŸåããããŸãã
- 圩床 æããè²ã®ãã¯ã»ã«åãããé åã匷調衚瀺ãããåŸåããããŸãã
- æãã ããã¯ããã©ã«ãã®æ±ºå®èŠå ã§ãããããããæè¯ã§ã-ãã¯ã»ã«é åã®è²ã®æãããèªåŒµã決å®ãããããæããé åãæãé«ããªããŸãã
- èµ€ãç·ãé æå®ãããRGBã«ã©ãŒãã£ãã«ãèªåŒµã®æ±ºå®èŠå ãšããŠäœ¿çšãããŸãã
- ã·ã¢ã³ãããŒã³ã¿ãã€ãšããŒããã©ã㯠æå®ãããCMYKã«ã©ãŒãã£ã³ãã«ãèªåŒµã®æ±ºå®èŠå ãšããŠäœ¿çšãããŸãïŒãã©ãã¯ã¯éåžžã«å¥åŠãªçµæã«ãªããŸãïŒã ïŒRGBããCMYKã«å€æããã«ã¯èšç®ãå¿ èŠã§ããããã®éã¯æ¯èŒçå°ãªããããã©ãŒãã³ã¹ã«æªåœ±é¿ãäžããŸãããïŒ
ããŒããäœæããããšããã®ããŒãã¯ãã¹ã¿ãŒããŒãã«è¿œå ãããŸãããã¹ãŠã®ããŒããäœæãããŠãã¹ã¿ãŒããŒãã«é 眮ããããšããã¹ã¿ãŒããŒãèªäœã3Dã·ãŒã³ã«é 眮ãããŸãã
-ãã¹ã¿ãŒããŒãã¯ãåŸã®ã¢ãã¡ãŒã·ã§ã³ã管çããããããããã«äœ¿çšãããŸãã
ããã¯ç°¡åãªæé ã®ããã«æãããããããŸãããããããªã倿ãããšãã¯éåžžã«æ³šæãå¿
èŠã§ããç»åã倿ãããšã3Dã·ãŒã³ãæŽæ°ãããæçµçã«ãŠãŒã¶ãŒã«è¡šç€ºãããŸãïŒéåžžã¯0.5ã2.0ç§ä»¥å
ïŒããããªã®å Žåããã£ã¹ãã¬ã€ã®ã¿ã€ãã³ã°ãæ£ç¢ºã«ããããšãéèŠã§ãããããªã倿ããã«ã¯ãåãã¬ãŒã ããããã®æé ã§å®è¡ãã3Dã·ãŒã³ã®ã¹ãããã·ã§ãããååŸããŸããã·ãŒã³ã衚瀺ãããåã«ã¹ãããã·ã§ãããæ®ãããå Žåãçµæã¯çŽç²ãªé»ã®ã€ã¡ãŒãžã«ãªããŸãããããã¯ãŠãŒã¶ãŒãèŠãããã®ã§ã¯ãããŸããããããã£ãŠãBlockCam㯠SCNSceneRendererDelegate颿°ã»ããã«åå ããŠãã·ãŒã³ãå®éã«ãŠãŒã¶ãŒã«è¡šç€ºãããã¿ã€ãã³ã°ãç¥ãå¿
èŠããããŸãã
次ã®ç»åã¯ãç»åã®æçµçãªåŠçæžã¿ããŒãžã§ã³ã§ããããã¯ãSCNViewã§ã® snapshotïŒïŒåŒã³åºãã®åºåã§ãããµã³ãã«ã¯æŒãåºããããã¯ã䜿çšããããã©ã«ãã®ã«ã¡ã©ã®åãã§è¡šç€ºãããŠããŸãã
ç»åã衚瀺ããããšããŠãŒã¶ãŒã¯ããããã®ãŸãŸä¿åããããããã€ãã®èŠèŠçåŽé¢ãç·šéããããå転ãŸãã¯ãºãŒã ã€ã³ãŸãã¯ãºãŒã ã¢ãŠãããŠããä¿åããïŒããããããäžåºŠïŒãªãã·ã§ã³ããããŸãããããªã®å Žåã3Dã·ãŒã³ã®ã¹ãããã·ã§ããããã£ããã£ããããšãã·ãŒã³ã¯ç Žæ£ãããŸãã
.SaveOriginalImageActionã®å€ã«å¿ããŠãå
ã®ç»åãä¿åãããŸãã ãŠãŒã¶ãŒãåŠçãããç»åãä¿åãããšãã¡ã¿ããŒã¿ã¯åŠçãããç»åãšãšãã«ä¿åãããŸãã ã¡ã¿ããŒã¿ã¯ãããã°ã©ã ã®ååãšããŒãžã§ã³ãããã³ã€ã¡ãŒãžã®äœææã«æå¹ãªãã©ã¡ãŒã¿ãŒã§æ§æãããŸãã
åŠçããããã¡ã€ã«ã®ä¿åã¯ãè€æ°ã¹ãããã®ããã»ã¹ã§ãã
- ç»åã¯æšæºã®
.jpgãã¡ã€ã«ãšããŠ/Scratchãã£ã¬ã¯ããªã«ä¿åãããŸãã - ã¡ã¿ããŒã¿ãä¿åãããç»åã«è¿œå ããããã®åŸãå¥ã®ãã¡ã€ã«ãšããŠåä¿åãããŸãïŒ
.jpgãã¡ã€ã«ãšããŠïŒã - å ã®ãã¡ã€ã«ãåé€ãããŸãã
- 倿Žããããã¡ã€ã«ã¯åçããŒã«ã«ã³ããŒãããŸãïŒé©åãªãã©ã¡ãŒã¿ãŒãèšå®ãã
PHAssetCreationRequestã䜿çšããŸã-åçããŒã«ã«ç»åãç§»åããããäžè¬çãªæ¹æ³ã¯ExifããŒã¿ãåé€ããããã§ãïŒã - æåãããšã倿Žããããã¡ã€ã«ã¯
/Scratchãã£ã¬ã¯ããªããåé€ãããŸãã
BlockCamã¯ãåŠçããããã¡ã€ã«ã«ã¡ã¿ããŒã¿ãä¿åããŸãã
| ã°ã«ãŒã | ã¿ã° | ä¿åãããå€ |
|---|---|---|
| TIFF | ã¢ãŒãã£ã¹ã | ãŠãŒã¶ãŒãæå¹ã«ããå ŽåããŠãŒã¶ãŒã®ååã |
| TIFF | èäœæš© | ãŠãŒã¶ãŒãæå¹ã«ããå ŽåããŠãŒã¶ãŒã®èäœæš©æååã |
| TIFF | ãœãããŠã§ã¢ | BlockCamã®ååãããŒãžã§ã³ããã«ãçªå·ã |
| Exif | UserComment | åŠçæžã¿ç»åã®çæã«äœ¿çšããããã©ã¡ãŒã¿ãŒã®ãªã¹ãã |
ç»åã®ååŠçãšãã¯ã»ã«åã«ã¯æéãããããããæ°ããç»åãåŠçããããã³ã«ããã¯ã»ã«åããŒã¿ïŒè²ã®é åã§æ§æãããïŒãããã€ã¹ã®ãã¡ã€ã«ã·ã¹ãã ã«ä¿åãããŸãã ãã®åŸããŠãŒã¶ãŒããã©ã¡ãŒã¿ãŒïŒ3D圢ç¶ãªã©ïŒã倿Žããå ŽåãååŠçã¯æ¢ã«å®äºããŠããããã¯ã»ã«åããŒã¿ã¯åå©çšãããŸãã ããã«ãããå€§å¹ ã«æéãç¯çŽã§ããå¯èœæ§ããããŸãã
ãŠãŒã¶ãŒãååŠçã«åœ±é¿ãããã©ã¡ãŒã¿ãŒã倿Žãããšãç»åã¯æåããååŠçãããŸãã ïŒããšãã°ããããã¯ãµã€ãºã倿Žãããšãå®å šãªååŠçãµã€ã¯ã«ãå®è¡ãããŸããïŒ
BlockCamã¯ãå®è¡æã®ã¡ãã»ãŒãžãšã¹ããŒã¿ã¹ããããã°ã³ã³ãœãŒã«ïŒååšããå Žåã倧éšåã®ã€ã³ã¹ã¿ã³ã¹ã§ã¯ååšããªãïŒãšããŒã«ã«SQLiteããŒã¿ããŒã¹ã«èšé²ããŸãã ããã«ãã å¿ èŠãçããå Žåã®äºåŸãããã°ã
Appleã®ããŒã¿ä¿æã«é¢ããããªã·ãŒïŒEUã®ããªã·ãŒã¯èšããŸã§ããããŸããïŒãèãããšãBlockCamã®ãã¹ãŠã®ãªãªãŒã¹ããŒãžã§ã³ã®ãã°ã¯ïŒã³ã³ãã€ã«æãã©ã°ãä»ããŠïŒåé€ãããå¯èœæ§ãé«ãã§ãã
ãã¹ãŠã®ãŠãŒã¶ãŒèšå®ïŒããã³ããã€ãã®ããã»ã¹èšå®ïŒã¯ã Settingsã¯ã©ã¹ãä»ããŠä¿åãããŸãã ãã®ã¯ã©ã¹ã¯ãããã°ã©ã ã®æ®ãã®éšåããã¯èŠããªãã¹ãã¬ãŒãžã¡ã«ããºã ãã«ãã»ã«åããŸãã çŸåšãã¹ãã¬ãŒãžã¡ã«ããºã 㯠UserDefaultsã§ãã èšå®ãããè€éã«ãªã£ãå ŽåããããããŒã¿ããŒã¹ã«ç§»è¡ããã®ã¯ç°¡åã§ãã
èšå®ã«ã¢ã¯ã»ã¹ããã«ã¯ãåŒã³åºãåŽã¯ Settingsã¯ã©ã¹ã®æäŸãããã¡ãœããã䜿çšããå¿
èŠããããŸãã ããã«ãããããŒã¿åã®æŽåæ§ã確ä¿ã§ããŸãã
Settingsã¯ã©ã¹ã¯èšå®ã¬ãã«ã®å€æŽéç¥ãæäŸããŸãïŒãããæåã«ã¯ã©ã¹ãäœæããäž»ãªçç±ã§ããïŒã
BlockCamã®èšå®ã以äžã«ç€ºããŸãã
| èšå· | ã¿ã€ã | ããã©ã«ã | äœ¿çšæ³ |
|---|---|---|---|
| .Initialized | String | "Initialized" | èšå®ãåæåããããã©ãããæ±ºå®ãããã©ã°ã BlockCamãæåã«å®è¡ããããšãã«ã .InitializedãnilãŸãã¯ç©ºã®å ŽåãBlockCamãæåã«å®è¡ããããšæ³å®ãããããããã¹ãŠã®èšå®ã®ããã©ã«ãå€ãæžã蟌ã¿ãŸãã |
| .BlockSize | æŽæ° | 48 | ç»ååŠçã®ãããã¯ãµã€ãºãããã¯ããã¯ã»ã«åãããåé åã®æ£æ¹åœ¢ã®ãµã€ãºã§ãã |
| .ShapeType | String | "Blocks" | åãã¯ã»ã«åé åã®3Dãªããžã§ã¯ããšåããåæåãããã£ã¹ãããŸãã |
| .InvertHeight | Boolean | false | å転é«ã/ãµã€ãºæ±ºå®ãã©ã°ã |
| .HeightSource | String | "Brightness" | é«ã/ãµã€ãºã決å®ããããã«äœ¿çšããã«ã©ãŒãã£ã³ãã«ãåæåãããã£ã¹ãããŸãã |
| .ImageSizeConstraints | String | "Medium" | ããã©ãŒãã³ã¹äžã®çç±ãããåŠçããåã«è¡ãç»åã®ãµã€ãºã®çž®å°éãæ±ºå®ããŸããåæåãããã£ã¹ãããŸããå®è¡æã«è§£éãããå®éã®å€ã |
| .VerticalExaggeration | String | "Medium" | 3D圢ç¶ãæŒãåºããŸãã¯æ¡å€§ãããšãã«å®è¡ããåçŽæ¹åã®èªåŒµã®éãåæåãããã£ã¹ãããŸãã |
| .InputQuality | Integer | 2 | å ¥åå質ã瀺ãå€ã 0ãã3ã®ç¯å²ã§ã3ãæé«å質ïŒããã³åŠçãæãé ãïŒã§ãã |
| .CurrentCamera | String | "Back" | æåŸã«äœ¿çšããã«ã¡ã©ã®äœçœ®ãåé¢ãŸãã¯èé¢ãåæåãããã£ã¹ãããŸãã |
| .LightColor | String | "White" | ã©ã€ãã®è²ã®ååãåæåãããã£ã¹ãããŸããåŸã§ã«ã©ãŒã©ã€ãã©ãªã¿ã€ãã®è²ã«å€æã§ããŸãã |
| .LightType | String | "Omni" | ã·ãŒã³ã®ç §æã«äœ¿çšãããã©ã€ãã®ã¿ã€ãã®ååãåæåãããã£ã¹ãããŸãã |
| .LightIntensity | String | "Normal" | ã·ãŒã³ãç §ããããã«äœ¿çšãããå ã®åŒ·åºŠãå®è¡æã«æ±ºå®ãããå®éã®å€ãåæåãããã£ã¹ãããŸãã |
| .FieldOfView | String | "Normal" | ã«ã¡ã©ã®èŠéãå®éã®å€ã¯å®è¡æã«æ±ºå®ãããŸããåæåãããã£ã¹ãããŸãã |
| .ShowHistogram | Boolean | false | ãã¹ãã°ã©ã 衚瀺ã衚瀺ããŸããçŸåšå®è£ ãããŠããŸããã |
| .HistogramBucketCount | æŽæ° | 256 | ãã¹ãã°ã©ã 衚瀺ã®è²æ°ãçŸåšå®è£ ãããŠããŸããã |
| .InitialView | String | "LiveView" | ãŠãŒã¶ãŒãæåŸã«è¡šç€ºãããã¥ãŒïŒã©ã€ããã¥ãŒãã¢ã«ãã ãªã©ïŒã |
| .FullyExtrudeLetters | Boolean | true | æåãå®å šã«æŒãåºãããããéšåçã«ã®ã¿æŒãåºãããããæ±ºå®ããŸãã |
| .LetterSmoothness | String | "Smooth" | æåã®æ²ç·ãã©ãã ãã¹ã ãŒãºã«äœæããããæ±ºå®ããŸããé«åè³ªã®æ²ç·ã«ã¯ã倧ããªããã©ãŒãã³ã¹ã³ã¹ããããããŸããå®è¡æã«æ±ºå®ãããå®éã®å€ãåæåãããã£ã¹ãããŸãã |
| .LetterFont | String | "Futura" | æŒãåºãããæåã®ã¬ã³ããªã³ã°ã«äœ¿çšãããã©ã³ãïŒããã³ãªãã·ã§ã³ã®å€ªãïŒããã©ã³ããã·ã¹ãã ã«ååšããªãå ŽåãBlockCamã¯æªå®çŸ©ã®ç¶æ ã«å ¥ããŸãã |
| .RandomCharacterSource | String | "Latin" | æåãæŒãåºããšãã«ã©ã³ãã ãªæåã®ãœãŒã¹ãšããŠäœ¿çšããååä»ãUnicodeç¯å²ãè€æ°ã®ç¯å²ãæå®ããã«ã¯ããããããã³ã³ãã§åºåããŸãã |
| .VideoFPS | æŽæ° | 1 | çŸåšäœ¿çšãããŠããŸããã |
| .VideoDimensions | String | "Smallest" | ãããªãçæãããšãã®æçµçãªãããªãµã€ãºã決å®ããŸããå®è¡æã«æ±ºå®ãããå®éã®å€ãåæåãããã£ã¹ãããŸãã |
| .VideoBlockSize | æŽæ° | 48 | ãããªåŠçã®ãããã¯ãµã€ãºãããã¯ããã¯ã»ã«åãããåé åã®æ£æ¹åœ¢ã®ãµã€ãºã§ãã |
| .UseMetal | Boolean | true | OpenGLã§ã¯ãªãMetalã䜿çšããããã«BlockCamã«æç€ºãããã©ã°ã |
| .AntialiasingMode | æŽæ° | 0 | ã¢ã³ããšã€ãªã¢ã¹ã¢ãŒããæ±ºå®ããŸãã |
| .InitialBestFit | Boolean | false | trueã®å ŽåãBlockCamã¯ããã¹ãŠã®ããŒãããã¥ãŒã«ã§ããã ãå³å¯ã«åãããããšããŸãã |
| .SaveOriginalImageAction | String | "Always" | å ã®ç»åãä¿åããæ¹æ³ãšã¿ã€ãã³ã°ã決å®ããŸããåæåãããã£ã¹ãããŸãã |
| .NextSequentialInteger | Integer | 0 | ãã¡ã€ã«åã®çæã«äœ¿çšã |
| .LoopSequentialIntegerAfter | Integer | 9999 | é£ç¶ããæŽæ°ã䜿çšããå Žåããã€ã«ãŒããéå§ããããæ±ºå®ããŸãã |
| .StartSequentialIntegerAt | Integer | 1 | é£ç¶æŽæ°ã®éå§å€ã |
| .IncreaseStarApexesWithProminence | Boolean | false | trueã®å Žåãæåœ¢ã®é ç¹ã®æ°ã¯è²ã®é«ããé¡èã«ãªãã«ã€ããŠå¢å ããŸãã |
| .StarApexCount | æŽæ° | 5 | æã®é ç¹ã®æ°ã .IncreaseStarApexesWithProminenceãtrueã®å Žåãããã¯é ç¹ã®éå§æ°ã§ãã |
| .HaltWhenCriticalThermal | Boolean | true | trueã®å ŽåãBlockCamã¯éå€§ãªæž©åºŠã¢ã©ãŒããåä¿¡ãããšåæ¢ããŸãïŒ fatalErroråŒã³åºããä»ããŠïŒãããã¯Appleã®ã¬ã€ãã©ã€ã³ã«éåããå¯èœæ§ããããåé€ãããå¯èœæ§ããããŸãã |
| .HaltOnLowPower | Boolean | true | trueã®å ŽåãBlockCamã¯äœé»åã¢ã©ãŒããåä¿¡ãããšåæ¢ããŸãïŒ fatalErroråŒã³åºããä»ããŠïŒãããã¯Appleã®ã¬ã€ãã©ã€ã³ã«éåããå¯èœæ§ããããåé€ãããå¯èœæ§ããããŸãã |
| .BestFitOffset | Double | 2.0 | .InitialBestFitãtrueã®å Žåã«ã«ã¡ã©ãåŸéãããŠãç»åã«ããå°ããã¬ãã£ããªã¹ããŒã¹ãäžããããã«äœ¿çšããå€ã |
| .LightingModel | String | "Phong" | 衚é¢ãããªã¢ã«ç §æã¢ãã«ãåæåãããã£ã¹ãããŸãã |
| .CappedLineBallLocation | String | "Top" | CappedLine圢ç¶ã®ããŒãã®ããŒã«ïŒããã£ãããïŒã®äœçœ®ãåæåãããã£ã¹ãããŸãã |
| .LoggingEnabled | Boolean | false | ãã®ã³ã°ãã©ã°ãæå¹ã«ããŸãã |
| .FontSize | æŽæ° | 36 | æŒãåºãããæåã®ãã©ã³ããµã€ãºã |
| .EnableUISounds | Boolean | true | Flagã¯ãUIãµãŠã³ããåçããŸãïŒãã¿ã³ãæŒããããšããªã©ïŒã ãã®å€ããfalseãã®å Žåãä»ã®ãã¹ãŠã®ãµãŠã³ããã©ã°ã¯ç¡èŠãããŸãã |
| .EnableShutterSound | Boolean | false | Flagã¯ãã«ã¡ã©ãã¿ã³ãæŒããããšãã«ã·ã£ãã¿ãŒé³ãåçããŸãã äžéšã®å°ççãªå Žæã§ã¯ãããã¯åžžã«çºçãããã®å€ãèšå®ããŠã广ã¯ãããŸããã |
| .EnableImageProcessingSound | Boolean | true | Flagã¯ãç»ååŠçã®éå§æãšçµäºæã«é³å£°ãåçããŸãã ç»ååŠçã«ã¯æéããããããããŠãŒã¶ãŒã¯ç»åããã€å®æããããçè§£ããã®ã«åœ¹ç«ã¡ãŸãã |
| .EnableVideoRecordingSound | Boolean | true | ãŠãŒã¶ãŒããããªã®èšé²ãéå§ããã³åæ¢ãããšãã«é³ãåçãããã©ã°ã |
| .EnableButtonPressSounds | Boolean | true | ãŠãŒã¶ãŒããã¿ã³ãæŒãããšãã«é³ãåçãããã©ã°ã |
| .EnableOptionSelectSounds | Boolean | true | ãŠãŒã¶ãŒãç»é¢äžã®èšå®ç»é¢ã§ãªãã·ã§ã³ãéžæãããšãã«é³ãåçãããã©ã°ã |
| .EnableCrashSounds | Boolean | false | ãã©ã°ã¯ãã¯ã©ãã·ã¥ãã€ã¢ãã°ã衚瀺ããããšãã«ãµãŠã³ããåçããŸãã ïŒDEBUG ã¢ãŒãã§ã³ã³ãã€ã«ãããå Žåã®ã¿æå¹ã§ãã |
| .MeshDotSize | String | "Medium" | ã¡ãã·ã¥ã®äžå¿ãããã®ãµã€ãºã .Noneã䜿çšãããå Žåãäžå€®ã®ãããã¯è¡šç€ºãããŸããã åæåãããã£ã¹ãããŸãã |
| .MeshLineThickness | String | "Medium" | ã¡ãã·ã¥ã©ã€ã³ã®å€ªãã åæåãããã£ã¹ãããŸãã |
| .RadiatingLineThickness | String | "Medium" | æŸå°ç·åœ¢ç¶ã®å€ªãã åæåãããã£ã¹ãããŸãã |
| .RadiatingLineCount | æŽæ° | 8 | æŸå°ã©ã€ã³åœ¢ç¶ã®æŸå°ã©ã€ã³ã®æ°ã ã4ãã¯åºç·æ¹åãæãç·ãã8ãã¯åºç·æ¹åãšãã®äžéãããã³ã16ãã¯zå¹³é¢ã®ããã«8æ¬ã®ç·ã瀺ããŸãã |
| .BlockChamferSize | String | "None" | ãããã¯åœ¢ç¶ã®é¢åãååŸ/ãšããžã®æ»ãããã åæåãããã£ã¹ãããŸãã |
| .MaxImageDimension | æŽæ° | 1024 | ç»åã®æå€§å¯žæ³ã åŠçããç»åã倧ããå Žåãæé·å¯žæ³ããã®å€ã«ãªãããã«ãµã€ãºå€æŽãããŸãã |
| .AddUserDataToExif | Boolean | false | Flagã¯ããŠãŒã¶ãŒãäœæããæ å ±ãåŠçæžã¿ç»åã®Exifãããã¯ã«è¿œå ããŸãã |
| .UserName | String | "" | ïŒããã©ã«ãã¯ç©ºçœã§ããïŒåŠçãããç»åã®Exifãããã¯ã«è¿œå ããããŠãŒã¶ãŒæå®ã®ååã ããã¯ã .AddUserDataToExifãtrueã®å Žåã«ã®ã¿çºçããŸãã |
| .UserCopyright | String | "" | ïŒããã©ã«ãã¯ç©ºçœã§ããïŒåŠçãããç»åã®Exifãããã¯ã«è¿œå ããããŠãŒã¶ãŒæå®ã®èäœæš©æååã ããã¯ã .AddUserDataToExifãtrueã®å Žåã«ã®ã¿çºçããŸã |
BlockCamã¯æ¬¡ã®ããžã¥ã¢ã«ããµããŒãããŠããŸãã
çŸåšãæŒãåºã广ã§ã¯æ¬¡ã®åœ¢ç¶ããµããŒããããŠããŸãïŒãŸãã¯ãµããŒããããäºå®ã§ãïŒã
| åœ¢ç¶ | ãã€ãã£ã | ã¡ã¢ |
|---|---|---|
| ããã㯠| ã¯ã-SCNBox |
Zè»žã«æ²¿ã£ãŠé·ããªã£ããã€ãã£ãããã¯ã¹ã®åœ¢ç¶ã |
| äžè§åœ¢ | ããã | ã«ã¹ã¿ã æ£äžè§åœ¢ã®åœ¢ç¶ã |
| äºè§åœ¢ | ããã | ã«ã¹ã¿ã æ£äºè§åœ¢ã |
| å è§åœ¢ | ããã | ã«ã¹ã¿ã æ£å è§åœ¢ã |
| ãªã¯ããŽã³ | ããã | ã«ã¹ã¿ã æ£å «è§åœ¢ã |
| ãã©ããã | ã¯ã-SCNPyramid |
ãã€ãã£ãã®ãã©ããã圢ç¶ã |
| ããã€ã | ã¯ã-SCNTorus |
ãã€ãã£ãããŒã©ã¹åœ¢ç¶ã |
| ã·ãªã³ã㌠| ã¯ã-SCNCylinder |
èªç¶ãªã·ãªã³ããŒåœ¢ç¶-ããŠããªé«æ¶åã«ãªããŸãã |
| ç | ã¯ã-SCNSphere |
ãã€ãã£ãã®ç圢ã |
| ã«ãã»ã« | ã¯ã-SCNCapsule |
ãã€ãã£ãã«ãã»ã«ã®åœ¢ç¶ãèãããã»ã©é¢çœããªãã |
| åé¢äœ | ããã | ã«ã¹ã¿ã æ£åé¢äœãœãªããã |
| æ | ããã | ã«ã¹ã¿ã æåœ¢ïŒååŸæ¹åã«çããé ç¹ãæã€ïŒãé ç¹ã®æ°ãå€ããããšãã§ããŸãã |
| CombinedForRGB | ã¯ã-çµã¿åãã | çäœãããŒã©ã¹ãã«ãã»ã«ã®çµã¿åããã |
| CombinedForHSB | ã¯ã-çµã¿åãã | çäœãããŒã©ã¹ãã«ãã»ã«ã®çµã¿åããã |
| ã¡ãã·ã¥ | ããã | çŸåšå®è£ ãããŠããŸããã |
| ã¬ã¿ãŒ | ã¯ã-SCNText |
ãã€ãã£ãã®æŒãåºãããã¹ããç¹ã«éã©ãã³ç³»ã®ã¢ã«ãã¡ãããã§ã¯ãéåžžã«é ããªãåŸåããããŸãã |
| è¡ | ã¯ã-SCNCapsule |
éåžžã«èãã«ãã»ã«åœ¢ç¶ã |
| CappedLines | ã¯ã-çµã¿åãã | ãŠãŒã¶ãŒèšå®ã«å¿ããŠãè¡ã®äžéšãäžéããŸãã¯äžéšã«çäœãé 眮ããéåžžã«èãã«ãã»ã«åœ¢ç¶ã |
| RadiatingLines | ã¯ã-çµã¿åãã | äžå¿ç¹ããæŸå°ç¶ã«åºããè€æ°ã®ç·ã ãŠãŒã¶ãŒã¯è¡æ°ãæå®ã§ããŸãã ããã¯ããã©ãŒãã³ã¹éèŠã®åœ¢ç¶ã§ãã |
代衚çãªãã¯ã»ã«åé åã®å圢ç¶ã¯ãæŒãåºããŸãã¯æ¡å€§ãããŸããæŒãåºãã®æ·±ããŸãã¯æ¡å€§ãµã€ãºã®æ±ºå®ã¯ããã¯ã»ã«åãããé åã®è²ã«äŸåããŸãã
| ã«ã©ãŒãã£ã³ãã« | äœ¿çšæ¹æ³ |
|---|---|
| Hue | è²ã®è²çžã¯ã3Dãªããžã§ã¯ãã®æ·±ã/ãµã€ãºã決å®ããŸããè²çžå€ã¯åšæçã§ããããšã«æ³šæããŠãã ããïŒ0.0ã¯åºæ¬çã«1.0ãšåãã§ãïŒããããã£ãŠãç·ã匷調衚瀺ãããŠããéãèµ€ã¿ã垯ã³ããã¯ã»ã«ã¯æå¶ãããåŸåããããŸãã |
| 圩床 | 圩床ã®å€ã¯æ·±ã/ãµã€ãºã決å®ããŸããæããè²ã¯å€§ãããªããŸãã |
| æãã | è²ã®æãããæ·±ã/ãµã€ãºã決å®ããŸããããã¯ããã©ã«ãå€ã§ãããã»ãšãã©ã®äººãããã°ã©ã ãæ©èœããããšãæåŸ ããæ¹æ³ã§ãã |
| èµ€ | èµ€ãã£ãã«ã¯æ·±ã/ãµã€ãºã決å®ããããã«äœ¿çšãããŸãã |
| ç· | ç·ã®ãã£ãã«ã¯æ·±ã/ãµã€ãºã決å®ããããã«äœ¿çšãããŸãã |
| é | éãã£ã³ãã«ã¯æ·±ã/ãµã€ãºã決å®ããããã«äœ¿çšãããŸãã |
| ã·ã¢ã³ | ïŒCMYKããã®ïŒåæã·ã¢ã³ãã£ã³ãã«ã䜿çšããŠã深床/ãµã€ãºã決å®ããŸãã |
| ããŒã³ã¿ | æ·±ã/ãµã€ãºã決å®ããããã«ãCMYKããã®åæããŒã³ã¿ãã£ãã«ã䜿çšãããŸãã |
| é»è² | åæã®é»è²ãã£ã³ãã«ïŒCMYKããïŒã䜿çšããŠæ·±ã/ãµã€ãºã決å®ããŸãã |
| é» | æ·±ã/ãµã€ãºã決å®ããããã«ãCMYKããã®åæé»ãã£ã³ãã«ã䜿çšãããŸãã |
BlockCamã¯å転ãã©ã°ããµããŒãããŠããŸããããã¯ããŠãŒã¶ãŒãå転ãèšå®ããå Žåãæ·±åºŠ/ãµã€ãºã¯ããèªäœã®æ¯isã§ãããæãé åãç®ç«ãããæããé åãæå¶ãŸãã¯é衚瀺ã«ããããšãæå³ããŸãã
BlockCamã¯ãã©ã€ãã®è²ãšã©ã€ãã®çš®é¡ã®å€æŽããµããŒãããŠããŸãã è²ã¯çŸåšãäºåå®çŸ©ãããè²ã®å°ããªã»ããã«å¶éãããŠããŸãã ã©ã€ãã®ã¿ã€ãã¯ãSceneKitã®æšæºã®ãã©ã¡ãŒã¿åãããŠããªãã©ã€ãïŒ .omniã .spotãªã©ïŒã«å¯Ÿå¿ããŠããŸãã
çŸåšãã©ã€ãã®äœçœ®ã¯ãŠãŒã¶ãŒã調æŽããããšã¯ã§ããŸããã
BlockCamã¯ã SCNViewã® allowsCameraControlãã©ã°ã䜿çšããŠããŠãŒã¶ãŒããžã§ã¹ãã£ã«ãã£ãŠæ¡å€§ãå
æ²¢ãå転ïŒ3軞ïŒã§ããããã«ããŸãã
æåã«ã¬ã³ããªã³ã°ãããšããçµæã¯ãã¥ãŒããæ¯èŒçé ãã«ããããã«èŠããå ŽåããããŸãã BlockCamã«ã¯ãç»åããã¥ãŒã«åãããããã®ãŠãŒã¶ãŒèšå®å¯èœãªãã©ã°ããããŸãã ãã®æ©èœã¯ãæ¡å€§ãšçž®å°ã«é¢ã㊠allowsCameraControl ãæ··åããåŸåããããŸãã
ãã¹ãŠã®ãŠãŒã¶ãŒèšå®ïŒããã³ããã€ãã®ããã»ã¹èšå®ïŒã¯ã Settings ã¯ã©ã¹ãä»ããŠä¿åãããŸãããã®ã¯ã©ã¹ã¯ãããã°ã©ã ã®æ®ãã®éšåããã¯èŠããªãã¹ãã¬ãŒãžã¡ã«ããºã ãã«ãã»ã«åããŸããçŸåšãã¹ãã¬ãŒãžã¡ã«ããºã 㯠UserDefaults ã§ããèšå®ãããè€éã«ãªã£ãå ŽåããããããŒã¿ããŒã¹ã«ç§»è¡ããã®ã¯ç°¡åã§ãã
èšå®ã«ã¢ã¯ã»ã¹ããã«ã¯ãåŒã³åºãåŽã¯ Settingsã¯ã©ã¹ã®æäŸãããã¡ãœããã䜿çšããå¿
èŠããããŸããããã«ãããããŒã¿åã®æŽåæ§ã確ä¿ã§ããŸãã
Settingsã¯ã©ã¹ã¯èšå®ã¬ãã«ã®å€æŽéç¥ãæäŸããŸãïŒãããæåã«ã¯ã©ã¹ãäœæããäž»ãªçç±ã§ããïŒã
BlockCamã¯3DåŠçã䜿çšããããã€ã¹ã®ã°ã©ãã£ãã¯ããããå®è¡ããŸãããŠãŒã¶ãŒãæé«å質ã®èšå®ãæå®ããå Žåãç¹å®ã®æ¥µç«¯ãªæ¡ä»¶ãçºçããå¯èœæ§ããããŸããããã€ã¹ãæå·ããä¿è·ããããã«ããã®ãããªå Žåã«BlockCamã®å®è¡ãäžæ¢ããèšå®ã䜿çšã§ããŸãã
| ã€ãã³ã | ã¢ã¯ã·ã§ã³ | èšå®ã®å¶åŸ¡ |
|---|---|---|
| Thermal | ãµãŒãã«ã€ãã³ããã¯ãªãã£ã«ã«ã¹ããŒãžïŒéç¥ã§ã¯æåéã.criticalïŒã«éãããšãèšå®ãtrueã®å ŽåãBlockCamã«ãã£ãŠäœæãããç±ã¹ãã¬ã¹ãæžããèŽåœçãªãšã©ãŒãçæãããŸãã |
.HaltWhenTooHot |
| ããããªãŒ | ããããªãŒãäœé»åç¶æ
ã«ãªã£ãå Žåãèšå®ãtrueã®å Žåãåå
é»åã«ããããªãŒã®å¯¿åœãä¿ã€ããã«èŽåœçãªãšã©ãŒãçæãããŸãã |
.HaltOnLowPower |
BlockCamã®èäœæš©Â©2019, 2020 by Stuart Rankin




